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

时间:2015-05-14 09:54:01

标签: 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")

我期望的Hive输出表是:

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

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

Column  Data Type       Comments
col     array<string>   from deserializer

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

类似行为的替代方法将是

val viewName = "tempView"
df.createTempView(viewName)

df.sparkSession.sql(s"DROP TABLE IF EXISTS ${tableName}")
df.sparkSession.sql(
  s"""CREATE TABLE $tableName AS
    | select * from $viewName
  """.stripMargin)

df.sparkSession.catalog.dropTempView(viewName)