Spark SQL HiveContext-saveAsTable创建了错误的架构

Spark SQL HiveContext-saveAsTable创建了错误的架构,hive,apache-spark,apache-spark-sql,Hive,Apache Spark,Apache Spark Sql,我尝试将数据帧存储到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 (nullabl

我尝试将数据帧存储到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
列数据类型注释
来自反序列化程序的列数组

为什么配置单元表与数据帧的模式不同?如何实现预期的输出?

这不是架构错误。Hive无法正确读取Spark创建的表,因为它甚至还没有正确的拼花镶嵌线。 如果执行
sqlCtx.sql('desc peopleHive').show()
,它应该显示正确的架构。
或者您可以使用spark sql客户端而不是配置单元。您还可以使用create table语法创建外部表格,其工作原理与Hive类似,但Spark对拼花地板的支持要好得多。

类似覆盖行为的解决方法是

val viewName=“tempView”
df.createTempView(视图名称)
sql(s“如果存在${tableName},则删除表”)
df.sparkSession.sql(
s“”将表$tableName创建为
|从$viewName中选择*
“.stripMargin)
df.sparkSession.catalog.dropTempView(视图名)

True,
hc.sql('desc peopleHive').show()显示正确的架构。我误解了Spark文档。我相信saveAsTable确实创建了一个可以从Spark外部使用的配置单元表。我现在明白情况并非如此。为了实现这一点,我需要运行
peopleDF.registerTempTable(“peopleHive”)hc.sql('create table peopleHive as select name,age from peopleHive')
这是一种向该表添加行的方法吗?或者我必须使用分区?有一种方法或指定正确的
serde
en
saveAsTable
以便
Imapala
Hive
可以读取它?@nanounaue,1)是的,有一种方法可以将行添加到现有表中,您不需要使用分区:
hc.sql('insert into table peopleHive select name,age from peopleHive')
。2) 我还没有找到使用
saveAsTable()
以便Hive能够读取它的方法。如果有,请告诉我。