我正在使用spark 2.0,我想知道,是否有可能列出特定蜂巢表的所有文件?如果是这样,我可以使用spark直接逐步更新这些文件sc.textFile("file.orc")
.如何在hive表中添加新分区?我可以从火花中使用蜂巢状的Metast?
有没有办法获得映射数据帧的内部配置单元功能 row => partition_path
我的主要推理是表的增量更新.现在我唯一想到的方法是FULL OUTER JOINSQL + 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基本上是扫描所有表格的操作)
添加分区:
可以使用针对非流式传输或用于流式传输数据的partitionBy提供来完成从spark添加分区.DataFrameWriterDataStreamWriter
public DataFrameWriter<T> partitionBy(scala.collection.Seq<String> colNames)
Run Code Online (Sandbox Code Playgroud)
所以如果你想分区数据year,那么monthspark会将数据保存到文件夹,如:
year=2016/month=01/
year=2016/month=02/
Run Code Online (Sandbox Code Playgroud)
您已经提到过orc- 您可以将保存用作以下orc格式:
df.write.partitionBy('year', 'month').format("orc").save(path)
Run Code Online (Sandbox Code Playgroud)
但你可以很容易插入蜂巢表,如:
df.write.partitionBy('year', 'month').insertInto(String tableName)
Run Code Online (Sandbox Code Playgroud)
获取所有分区:
Spark sql基于配置单元查询语言,因此您可以使用它SHOW PARTITIONS来获取特定表中的分区列表.
sparkSession.sql("SHOW PARTITIONS partitionedHiveTable")
Run Code Online (Sandbox Code Playgroud)
只需确保.enableHiveSupport()在创建会话时有SparkSessionBuilder,并确保是否已正确配置hive-conf.xml等
小智 5
在使用scala的spark中,我们可以使用目录来获取分区:
spark.catalog.listColumns(<databasename>, <tablename>)
.filter($"isPartition" === true)
.select($"name").collect()
Run Code Online (Sandbox Code Playgroud)