我正在使用spark 2.0,我想知道,是否可以列出特定蜂巢表的所有文件?如果是这样,我可以使用spark sc.textFile("file.orc")
直接逐步更新这些文件。
如何在hive表中添加新分区?我可以从火花上使用hive Metastore上的api吗?
有没有办法获得映射数据框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基本上是扫描所有表的操作)
答案 0 :(得分:7)
添加分区:
可以使用DataFrameWriter
中为非流式传输提供partitionBy
或使用DataStreamWriter
为流式数据添加来自spark的分区。
public DataFrameWriter<T> partitionBy(scala.collection.Seq<String> colNames)
因此,如果您想按year
和month
对数据进行分区,则会将数据保存到文件夹,如:
year=2016/month=01/
year=2016/month=02/
您提到了orc
- 您可以将保存用作orc
格式:
df.write.partitionBy('year', 'month').format("orc").save(path)
但您可以轻松地插入到hive表中,如:
df.write.partitionBy('year', 'month').insertInto(String tableName)
获取所有分区:
Spark sql基于hive查询语言,因此您可以使用SHOW PARTITIONS
获取特定表中的分区列表。
sparkSession.sql("SHOW PARTITIONS partitionedHiveTable")
使用 .enableHiveSupport()
创建会话时,请务必确保SparkSessionBuilder
,并确保您是否正确配置了hive-conf.xml
etc.
答案 1 :(得分:-1)
在使用Scala的Spark中,我们可以使用目录来获取分区:
**/home/sahilra/Desktop/DOcs/Web_Dev/git_projects ** ssh-add ~/.ssh/id_rsa
Could not add identity "/home/mobaxterm/.ssh/id_rsa": agent refused operation