【问题标题】:Spark schema using bucketBy is NOT compatible with Hive使用 bucketBy 的 Spark 模式与 Hive 不兼容
【发布时间】:2019-02-10 11:07:51
【问题描述】:

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

表是在 Hive 中创建的,但架构不正确。我无法从 Hive 表中选择任何数据。

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

我收到以下消息:

以与 Hive 不兼容的 Spark SQL 特定格式将分桶数据源表 emp.bucketed_table1 持久化到 Hive 元存储中。

Hive Schema 正在创建中,如下所示:

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

如何将数据帧保存并写入 Hive 表以供日后查看?

【问题讨论】:

标签: apache-spark pyspark hive


【解决方案1】:

虽然 Spark(至少在版本 here 和 here 所述,但可以让 Spark 输出 Hive 可读的分桶数据,通过使用 SparkSQL 将数据加载到 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")

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 如果我们在 pyspark 中使用 hive 表创建数据框,如何通过 pyspark 创建分桶表,以后可以在 hive 中查看?
    • 好吧,我的理解是你不能。但可能是我错了。您可以将 spark.read 用于 Spark,但来自 Hive 或 IMPALA 编辑器 - 我将消息不兼容的意思完全理解为,并且没有找到查看方法。可能有,但信息非常明确。可能是自定义(de)序列化程序...
    • 唯一的其他选项 imhu(nderstandjng) 是 df.write.partitionBy 到已创建的启用了动态分区的 Hive 表。但这是一种不同的方法。
    • 是的,我们可以使用 spark.read(文件的路径位置)或使用 sql 上下文将数据取回 pyspark。无论如何要查看 hive 中的分桶表,这些表是由 pyspark 使用 bucketBy 选项创建的。
    • 这很有趣。我在最新的 dics 中没有找到。稍后再试,如果是,请撤回答案。
    猜你喜欢
    • 2016-02-20
    • 2019-12-10
    • 2017-01-07
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2019-05-10
    • 2015-11-16
    相关资源
    最近更新 更多