Spark SQL HiveContext - saveAsTable创建错误的模式

Mir*_*rko 7 hive apache-spark apache-spark-sql

我尝试将Dataframe存储到Spark 1.3.0(PySpark)中的持久Hive表中.这是我的代码:

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")
Run Code Online (Sandbox Code Playgroud)

我期望的Hive输出表是:

Column  Data Type   Comments
age     long        from deserializer
name    string      from deserializer
Run Code Online (Sandbox Code Playgroud)

但上面代码的实际输出Hive表是:

Column  Data Type       Comments
col     array<string>   from deserializer
Run Code Online (Sandbox Code Playgroud)

为什么Hive表与DataFrame的架构不同?如何实现预期产量?

use*_*226 6

这不是架构是错的.Hive无法正确读取Spark创建的表,因为它甚至没有正确的镶木地板serde.如果这样做sqlCtx.sql('desc peopleHive').show(),它应该显示正确的架构.或者您可以使用spark-sql客户端而不是hive.您还可以使用create table语法创建外部表,它就像Hive一样工作,但Spark对镶木地板有更好的支持.

  • 是的,`hc.sql('desc peopleHive').show()`显示正确的模式.我误解了Spark的文档.我相信saveAsTable会创建一个可以从外部Spark使用的Hive表.我现在明白,事实并非如此.为了实现这一点,我需要运行`peopleDF.registerTempTable("peopleHive")hc.sql('create table peopleHive as select name,age from peopleHive')` (5认同)