SPARK SQL HIVECONTEXT-可保护的架构会产生错误的模式



我尝试将数据框架存储到Spark 1.3.0(Pyspark)中的持久蜂巢表中。这是我的代码:

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

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

Column  Data Type       Comments
col     array<string>   from deserializer

为什么蜂巢表与dataFrame的模式不同?如何实现预期输出?

这不是架构是错误的。Hive无法正确读取由Spark创建的表,因为它甚至还没有正确的Parquet Serde。如果执行sqlCtx.sql('desc peopleHive').show(),则应显示正确的模式。或者,您可以使用Spark-SQL客户端而不是Hive。您也可以使用创建表语法来创建外部表,就像蜂巢一样有效,但是Spark对Parquet有更好的支持。

替代行为的解决方法将为

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)

相关内容

  • 没有找到相关文章

最新更新