首页 文章

Hive on Spark列出特定配置单元表的所有分区并添加分区

提问于
浏览
3

我正在使用spark 2.0,我想知道,是否有可能列出特定蜂巢表的所有文件?如果是这样,我可以使用spark sc.textFile("file.orc") 直接逐步更新这些文件 . 如何在hive表中添加新分区?我可以从火花中使用蜂巢状的Metast?

有没有办法获得映射数据帧的内部hive函数 row => partition_path

我的主要推理是表的增量更新 . 现在我唯一能想到的方法是 FULL OUTER JOIN SQL SaveMode.Overwrite ,效率不高,因为他会覆盖所有表,而我的主要兴趣是某些特定分区的增量更新/添加新分区

从我在HDFS上看到的情况来看,当SaveMode.Overwrite spark会发出表定义,即 CREATE TABLE my_table .... PARTITION BY (month,..) . spark将所有文件放在 $HIVE/my_table 下,而不是 $HIVE/my_table/month/... ,这意味着他没有对数据进行分区 . 当我写了 df.write.partitionBy(...).mode(Overwrite).saveAsTable("my_table") 时,我在hdfs上看到它是正确的 . 我使用 SaveMode.Overwrite 因为我正在更新记录而不是附加数据 .

我使用 spark.table("my_table") 加载数据,这意味着火花懒惰加载表是一个问题,因为我不想加载所有表只是if的一部分 .

对于这个问题:

1.由于我使用了 partitionBy() ,或者他比较了当前的分区,并且如果它相同,他将不会随机播放数据 .

2.当从数据中改变部分,即仅针对特定的月/年时,是否足够聪明地使用分区修剪,并应用该更改而不是加载所有数据? (FULL OUTER JOIN基本上是扫描所有表格的操作)

1 回答

  • 6

    Adding partitions:

    可以使用 DataFrameWriter 中提供的partitionBy(对于非流式传输)或使用 DataStreamWriter (对于流式数据)来添加来自spark的分区 .

    public DataFrameWriter<T> partitionBy(scala.collection.Seq<String> colNames)
    

    所以如果你想通过 yearmonth 分区数据,spark会将数据保存到文件夹,如:

    year=2016/month=01/
    year=2016/month=02/
    

    您已经提到orc - 您可以将保存用作 orc 格式:

    df.write.partitionBy('year', 'month').format("orc").save(path)
    

    但你可以很容易插入蜂巢表,如:

    df.write.partitionBy('year', 'month').insertInto(String tableName)
    

    Getting all partitions:

    Spark sql基于hive查询语言,因此您可以使用SHOW PARTITIONS获取特定表中的分区列表 .

    sparkSession.sql("SHOW PARTITIONS partitionedHiveTable")
    

    只需确保在使用 SparkSessionBuilder 创建会话时 .enableHiveSupport() 并确保是否正确配置了hive-conf.xml etc.

相关问题