2015-05-14 2 views
7

Я пытаюсь сохранить Dataframe в постоянной таблице Hive в Spark 1.3.0 (PySpark). Это мой код:Spark SQL HiveContext - saveAsTable создает неправильную схему

sc = SparkContext(appName="HiveTest") 
hc = HiveContext(sc) 
peopleRDD = sc.parallelize(['{"name":"Yin","age":30}']) 
peopleDF = hc.jsonRDD(peopleRDD) 
peopleDF.printSchema() 
#root 
# |-- age: long (nullable = true) 
# |-- name: string (nullable = true) 
peopleDF.saveAsTable("peopleHive") 

Улей выходной таблицы я ожидаю:

Column Data Type Comments 
age  long  from deserializer 
name string  from deserializer 

Но фактический выход Hive таблица выше код:

Column Data Type  Comments 
col  array<string> from deserializer 

Почему улей таблица не та же самая схема, что и DataFrame? Как достичь ожидаемого результата?

ответ

6

Это не схема неправильно. Улей не умеет правильно читать таблицу, созданную Spark, потому что у нее еще нет правого паркета. Если вы делаете sqlCtx.sql('desc peopleHive').show(), он должен показать правильную схему. Или вы можете использовать клиент spark-sql вместо улья. Вы также можете использовать синтаксис create table для создания внешних таблиц, который работает так же, как Hive, но Spark имеет гораздо лучшую поддержку паркета.

+5

True, 'hc.sql ('desc peopleHive'). Show()' показывает правильную схему. Я неправильно понял документацию Spark. Я считал, что saveAsTable создает таблицу Hive, которая может использоваться извне Spark. Теперь я понимаю, что это не так. Для этого мне нужно запустить 'peopleDF.registerTempTable (« peopleHive ») hc.sql (« create table peopleHive as select name, age from peopleHive »)' – Mirko

+0

Это способ добавления строк в эту таблицу? Или я должен использовать раздел? Есть способ или указать правильный 'serde' en' saveAsTable', поэтому 'Imapala' или' Hive' могут его прочитать? – nanounanue

+1

@nanounanue, 1) да, есть способ добавить строки в существующую таблицу, и вам не нужно использовать разделы: 'hc.sql ('insert into table peopleHive select name, age from peopleHive')'. 2) Я не нашел способ использовать 'saveAsTable()', чтобы Hive мог его прочитать. Пожалуйста, дайте мне знать, если вы это сделаете. – Mirko

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