我正在使用Spark版本2使用bucketBy
写入和保存数据帧。
表是在Hive中创建的,但没有正确的架构。我无法从配置单元表中选择数据。
(DF.write
.format('orc')
.bucketBy(20, 'col1')
.sortBy("col2")
.mode("overwrite")
.saveAsTable('EMP.bucketed_table1'))
我收到以下消息:
将存储桶中的数据源表
emp
。bucketed_table1
保留在Spark SQL特定格式的Hive元存储中,这与Hive不兼容。
配置模式如下创建:
hive> desc EMP.bucketed_table1;
OK
col array<string> from deserializer
如何将数据框保存并写入到配置单元表中,以便以后查看?
答案 0 :(得分:1)
所有其他DF Writer方法都允许通过Hive和Impala编辑器从这些存储桶表中进行后续选择,除非它们不是Spark存储桶。
您需要通过spark.read从存储桶中进行选择。 ...
这应该有所帮助:https://spark.apache.org/docs/latest/sql-programming-guide.html
您的问题的答案是,当前无法通过Hive或Impala从Spark存储桶表中进行选择。
答案 1 :(得分:1)
如here和here所述,虽然Spark(至少在版本<= 2.4中)不直接支持Hive的存储桶格式,但可以使Spark来输出存储的存储桶数据通过使用SparkSQL将数据加载到Hive中,Hive可以读取;按照您的示例,它将类似于:
//enable Hive support when creating/configuring the spark session
val spark = SparkSession.builder().enableHiveSupport().getOrCreate()
//register DF as view that can be used with SparkSQL
DF.createOrReplaceTempView("bucketed_df")
//create Hive table, can also be done manually on Hive
val createTableSQL = "CREATE TABLE bucketed_table1 (col1 int, col2 string) CLUSTERED BY col1 INTO 20 BUCKETS STORED AS PARQUET"
spark.sql(createTableSQL)
//load data from DF into Hive, output parquet files will be bucketed and readable by Hive
spark.sql("INSERT INTO bucketed_table1 SELECT * FROM bucketed_df")