类似于边的情况,在使用分区保存spark sql中的parquet表时,
# schema definitioin
final StructType schema = DataTypes.createStructType(Arrays.asList(
DataTypes.createStructField("time", DataTypes.StringType, true),
DataTypes.createStructField("accountId", DataTypes.StringType, true),
...
DataFrame df = hiveContext.read().schema(schema).json(stringJavaRDD);
df.coalesce(1)
.write()
.mode(SaveMode.Append)
.format("parquet")
.partitionBy("year")
.saveAsTable("tblclick8partitioned");
Spark警告:
以特定于spark sql的格式将分区数据源关系持久化到配置单元元存储中,这与配置单元不兼容
在Hive中:
hive> describe tblclick8partitioned;
OK
col array<string> from deserializer
Time taken: 0.04 seconds, Fetched: 1 row(s)
显然,模式是不正确的-但是如果我使用 saveAsTable
在没有分区的sparksql中,可以毫无问题地查询表。
问题是如何使sparksql中的parquet表与具有分区信息的hive兼容?
2条答案
按热度按时间70gysomp1#
这是因为dataframe.saveastable创建的是rdd分区,而不是hive分区,解决方法是在调用dataframe.saveastable之前通过hql创建表。spark-14927的示例如下:
5vf7fwbs2#
解决方案是使用配置单元创建表,然后使用
...partitionBy("year").insertInto("default.mytable")
.根据我的经验,在配置单元中创建表,然后使用
...partitionBy("year").saveAsTable("default.mytable")
不起作用。这是spark 1.6.2。