使用bucketBy的Spark模式与Hive不兼容

时间:2018-09-05 10:24:19

标签: apache-spark hive

我正在使用Spark版本2使用bucketBy写入和保存数据帧。

表是在Hive中创建的,但没有正确的架构。我无法从配置单元表中选择数据。

(DF.write
   .format('orc')
   .bucketBy(20, 'col1')
   .sortBy("col2")
   .mode("overwrite")
   .saveAsTable('EMP.bucketed_table1'))

我收到以下消息:

  

将存储桶中的数据源表empbucketed_table1保留在Spark SQL特定格式的Hive元存储中,这与Hive不兼容。

配置模式如下创建:

hive> desc EMP.bucketed_table1;
OK
col                     array<string>           from deserializer

如何将数据框保存并写入到配置单元表中,以便以后查看?

2 个答案:

答案 0 :(得分:1)

所有其他DF Writer方法都允许通过Hive和Impala编辑器从这些存储桶表中进行后续选择,除非它们不是Spark存储桶。

您需要通过spark.read从存储桶中进行选择。 ...

这应该有所帮助:https://spark.apache.org/docs/latest/sql-programming-guide.html

您的问题的答案是,当前无法通过Hive或Impala从Spark存储桶表中进行选择。

答案 1 :(得分:1)

herehere所述,虽然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")