2017-02-14 3 views
2

Каков правильный способ вставки DF в Hive Внутренняя таблица в режиме добавления. Кажется, мы можем напрямую написать DF в Hive, используя метод saveAsTable ИЛИ сохранить DF в таблице temp, а затем использовать запрос.Как вставить Spark DataFrame в Hive Внутренняя таблица?

df.write().mode("append").saveAsTable("tableName") 

ИЛИ

df.registerTempTable("temptable") 
sqlContext.sql("CREATE TABLE IF NOT EXISTS mytable as select * from temptable") 

Будет ли второй подход добавить записи или перезаписи?

Есть ли другой способ эффективно написать DF для Hive Internal table?

+0

Это зависит от того, как (тип) будет храниться ваши таблицы и где. – FaigB

ответ

2

df.saveAsTable("tableName", "append") устарел. Вместо этого вы должны использовать второй подход.

sqlContext.sql("CREATE TABLE IF NOT EXISTS mytable as select * from temptable") 

Будет создана таблица, если таблица не существует. Когда вы запустите свой код во второй раз, вам нужно отказаться от существующей таблицы, иначе ваш код выйдет с исключением.

Другой подход, если вы не хотите бросать стол. Создайте таблицу отдельно, затем вставьте свои данные в эту таблицу.

Ниже код будет добавлять данные в существующую таблицу

sqlContext.sql("insert into table mytable select * from temptable") 

И ниже код будет перезаписывать данные в существующую таблицу

sqlContext.sql("insert overwrite table mytable select * from temptable") 

Этот ответ основан на Спарк 1.6.2. Если вы используете другую версию Spark, я бы предложил проверить соответствующую документацию.

+0

Спасибо, что он работает отлично. – Shankar

5

Ни один из вариантов здесь не работал для меня/возможно, обесценился с момента написания ответа.

Согласно последним spark API docs (для Спарк 2,1), он использует метод insertInto() из DataFrameWriter класса

Я использую Python PySpark API, но это было бы то же самое в Scala:

df.write.insertInto(target_db.target_table,overwrite = False) 

Это работало для меня.

Смежные вопросы