当前位置: 首页 > 知识库问答 >
问题:

Spark上的配置单元列出特定配置单元表的所有分区,并添加一个分区

赫连彬炳
2023-03-14

我正在使用Spark2.0,我想知道,是否可以列出特定配置单元表的所有文件?如果是这样,我可以直接使用sparksc.textfile(“file.orc”)增量地更新这些文件。如何向配置单元表添加新分区?有没有关于蜂巢转移瘤的api我可以从Spark使用?

有什么方法可以获得映射dataframerow=>partition_path的内部配置单元函数吗

我的主要理由是对表进行增量更新。现在,我知道的唯一方法是完全外部联接SQL+savemode.overwrite,这不是很有效,因为他将覆盖所有表,而我主要感兴趣的是对某些特定分区进行增量更新/添加新分区

根据我在HDFS上看到的内容进行编辑,当savemode.overwrite spark将发出表定义,即create table my_table...分区(月份,..)。spark将所有文件放在$hive/my_table下,而不是$hive/my_table/month/...下,这意味着他没有对数据进行分区。当我编写df.write.partitionby(...).mode(Overwrite).saveastable(“my_table”)时,我在hdfs上看到它是正确的。我使用了savemode.overwrite,因为我正在更新记录,而不是追加数据。

我使用spark.table(“my_table”)加载数据,这意味着spark会懒洋洋地加载表,这是一个问题,因为我不想加载所有表,只是IF的一部分。

对于这个问题:

1.spark是否会因为我使用了partitionby()而洗牌数据,或者他比较了当前的分区,如果是相同的分区,他不会洗牌数据。

共有1个答案

江永安
2023-03-14

添加分区:

从spark添加分区可以使用dataframeWriter中提供的partitionby,用于非流数据,或者使用datastreamWriter用于流数据。

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

因此,如果希望按对数据进行分区,spark将把数据保存到文件夹中,如下所示:

year=2016/month=01/
year=2016/month=02/
df.write.partitionBy('year', 'month').format("orc").save(path)
df.write.partitionBy('year', 'month').insertInto(String tableName)

Spark sql基于配置单元查询语言,因此可以使用show partitions获取特定表中的分区列表。

sparkSession.sql("SHOW PARTITIONS partitionedHiveTable")

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

 类似资料:
  • 但是我得到了这个错误: sparkException:由于阶段失败而中止作业:阶段0.0中的任务236失败4次,最近的失败:阶段0.0中丢失任务236.3(TID 287,server,executor 17):org.apache.hadoop.security.AccessControlException:权限被拒绝:user=user,access=read,inode=“/path-to-

  • 我正在与AWS工作,我有使用Spark和Hive的工作流。我的数据是按日期分区的,所以每天我的S3存储中都有一个新分区。我的问题是,当有一天加载数据失败时,我不得不重新执行那个分区。接下来编写的代码是: 在我的流动中发生了什么?如果我使用savemode.overwrite,完整的表将被删除,并且只保存分区。如果我使用savemode.append,我可能会有重复的数据。 我想要的是:在表中,分区

  • 更新:恰恰相反。实际上,我们的表非常大,就像3个TB有2000个分区。3TB/256MB实际上会达到11720,但我们的分区数量与表的物理分区数量完全相同。我只想了解任务是如何在数据量上生成的。

  • 从Spark1.6开始,根据官方文档,我们不能向DataFrame添加特定的配置单元分区 我相信这很有效。在Spark1.6中有没有替代方案可以实现这一点? 根据我的理解,Spark1.6加载了所有分区,如果我筛选特定分区,它效率不高,它会击中内存并抛出GC(垃圾收集)错误,因为成千上万的分区被加载到内存中,而不是特定的分区。

  • 我有一个复杂的/嵌套的配置单元外部表,它是在HDFS顶部创建的(文件是avro格式的)。当我运行配置单元查询时,它会显示所有记录和分区。 然而,当我在Spark中使用相同的表时: 请注意,当我查看数据时,分区列不是底层保存数据的一部分,但当我通过hive查询表时,我可以看到它。当我尝试使用PySpark加载avro文件时,我也可以看到分区列: 所以我想知道那是什么样子?