Pyspark: проблемы со вставкой в таблицу в Hive с использованием ноутбука Zeppelin

1

ПРИМЕЧАНИЕ. Это записывается в блокнот Zeppelin.

Я пытаюсь скопировать содержимое исходной таблицы, превратить NULLS в 0 и вставить ее в целевую таблицу. Однако я столкнулся с ошибкой:

AnalysisException: u'\nUnsupported language features in query: INSERT INTO TABLE..

При чтении в Интернете кажется, что Spark не поддерживает INSERT INTO, однако я читал, что вы можете использовать фреймворк данных и добавить его в таблицу. Вот мой оригинальный код:

%pyspark
from pyspark.context import SparkContext

df = sqlContext.sql("SELECT * FROM test_target")

dfr=df.collect()
print(dfr)

Это моя попытка попытаться внедрить метод INSERT INTO/dataframe. Я все еще получаю ту же ошибку AnalysisException.

%pyspark
from pyspark.context import SparkContext

sql = sqlContext.sql("INSERT INTO TABLE kenny_target('user', 'age') SELECT 'user', COALESCE('age', 0L) FROM kenny_source")
frame= sqlContext.createDataFrame(sql).collect()
frame.write.mode("append").saveAsTable("kenny_source_test")

test = sqlContext.sql("SELECT * FROM test_source_test")
dfr=test.collect()
print(dfr)
  • 0
    Я забыл добавить, что это было в блокноте Zeppelin. `` Является правильным синтаксисом. Я запомню это сейчас.
  • 0
    frame.write.mode ("append"). saveAsTable ("kenny_source_test") должно быть df.write.mode ("append"). saveAsTable ("kenny_source_test"), верно?
Показать ещё 3 комментария
Теги:
hive
pyspark

1 ответ

1
Лучший ответ

Вы предоставили следующий код.

%pyspark
from pyspark.context import SparkContext

sql = sqlContext.sql("INSERT INTO TABLE kenny_target('user', 'age') SELECT 
'user', COALESCE('age', 0L) FROM kenny_source")
frame= sqlContext.createDataFrame(sql).collect()
frame.write.mode("append").saveAsTable("kenny_source_test")

Вы не можете сделать это по некоторым причинам.

1. Вы снова пытаетесь создать DataFrame.

Предположим, поддерживается INSERT INTO TABLE. Когда вы выполните sqlContext.sql (он создаст DataFrame).

sql = sqlContext.sql("INSERT INTO TABLE kenny_target('user', 'age') SELECT 'user', COALESCE('age', 0L) FROM kenny_source")

Следующая строка. Когда вы запустите это, искра вызовет ошибку.

frame = sqlContext.createDataframe(sql)

TypeError: данные уже являются DataFrame

2. Вы пытаетесь собрать() DataFrame и записать его в таблицу.

У вас есть эта строка кода.

# Since, you wrote sql = sqlContext.sql('query')
# You could write frame = sql.collect()
frame = sqlContext.createDataFrame(sql).collect()

Обратите внимание: после сбора DataFrame (в данном случае фрейма) он больше не является DataFrame. Команда collect() всегда собирает DataFrame как List.

И последняя строка не работает, потому что кадр - это список (как вы его собирали()).

frame.write.mode("append").saveAsTable("kenny_source_test")

Он выдает сообщение об ошибке

Объект 'list' не имеет атрибута 'write' # Причина: frame теперь является списком

Разрешение:

# SELECT user and age into 'frame' by creating a DataFrame called as 'frame'
frame = sqlContext.sql('''SELECT 'user', COALESCE('age', 0L) FROM kenny_source''')

# Write it to the table: kenny_source_test
frame.write.mode("append").saveAsTable("kenny_source_test") 
  • 0
    Это сработало, большое спасибо. Изо всех сил пытался найти исправление в Интернете.
  • 1
    Отредактировал ответ. Я надеюсь, что этот ответ даст вам представление.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню