【问题标题】:Spark-Hive partitioningSpark-Hive 分区
【发布时间】:2016-03-21 14:43:53
【问题描述】:

Hive 表是使用 4 个分区创建的。

CREATE TABLE IF NOT EXISTS hourlysuspect ( cells int, sms_in int) partitioned by (traffic_date_hour string) stored as ORC into 4 buckets 

spark 代码中的以下几行将数据插入到此表中

 hourlies.write.partitionBy("traffic_date_hour").insertInto("hourly_suspect")

在 spark-defaults.conf 中,并行进程数为 128

spark.default.parallelism=128

问题是当插入发生在 hive 表中时,它有 128 个分区而不是 4 个桶。 defaultParallelism 不能减少到 4,因为这会导致系统非常缓慢。另外,我尝试过 DataFrame.coalesce 方法,但这会使插入速度太慢。

有没有其他方法可以在数据插入表时强制bucket个数为4?

【问题讨论】:

  • 需要更多洞察力,特别是 hourlies.write 的代码。但如果我不得不猜测,您正在尝试在不使用收集或获取的情况下保存数据。因此,每个执行程序都试图将数据保存到 hdfs,使其达到 128(这是您的并行度)。
  • 没错,执行程序正在使用默认并行度写入 hdfs。 hourlies 是一个 DataFrame,write 是一个为 DataFrame 定义的函数

标签: apache-spark hive


【解决方案1】:

截至今天 {spark 2.2.0} Spark 不支持使用 spark-sql 本地写入分桶配置单元表。在创建分桶表时,表模式中的一列上应该有一个 clusteredBy 子句。我在指定的 CreateTable 语句中看不到这一点。假设它确实存在并且您知道聚类列,您可以添加 .bucketBy([colName]) 使用 DataFrameWriter API 时的 API。

Spark2.0+ 的更多详情:[链接] (https://spark.apache.org/docs/2.0.0/api/java/org/apache/spark/sql/DataFrameWriter.html)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 2019-02-16
    • 2016-07-15
    • 2016-04-02
    • 1970-01-01
    相关资源
    最近更新 更多