【问题标题】:Apache Spark partition by output pathApache Spark 按输出路径分区
【发布时间】:2022-12-18 03:25:29
【问题描述】:

我有如下所示的 CSV 数据。

tenantId, siteId, TrackingID
1,A,V
2,V,V
1,A,V
2,C,D

我需要按tenantId 对这些数据进行分区并将其存储到{tenantid}\sample1.csv 之类的目录中,即

C:\1\sample1.csv
C:\2\sample1.csv

我看到 Spark 的 partitionBy 使用分区列名称创建不同的目录 C:\**tenantid**=1\sample1.csv

有什么方法可以解决这个问题吗?

【问题讨论】:

  • 不,输出路径中总是会有列名......
  • @AlexOtt 不完全是“总是”
  • 我对火花还很陌生,请帮助我理解这一点。是否可以编写自定义代码并实现这一目标?任何指导。

标签: apache-spark pyspark apache-spark-sql


【解决方案1】:

从技术上讲,您可以通过使用 ALTER TABLE ADD PARTITION DDL 并指定每个分区的位置来“手动”预先创建分区映射。然后,使用 Spark df.write.insertInto() 写入数据。

scala> spark.sql("create table adb.test (siteid string, trackingid string) partitioned by (tenantid string) stored as textfile")
scala> spark.sql("alter table adb.test add partition (tenantid = '1') location '/user/hive/warehouse/adb.db/test/1'")
scala> spark.sql("alter table adb.test add partition (tenantid = '2') location '/user/hive/warehouse/adb.db/test/2'")
scala> spark.sql("alter table adb.test add partition (tenantid = '3') location '/user/hive/warehouse/adb.db/test/3'")
scala> val df = Seq(("A","V","1"),("V","V","2"),("A","V","1"),("C","D","2")).toDF("siteid","trackingid","tenantid")

scala> df.write.mode("append").format("hive").insertInto("adb.test")

scala> spark.sql("select * from adb.test").show(false)
+------+----------+--------+
|siteid|trackingid|tenantid|
+------+----------+--------+
|A     |V         |1       |
|A     |V         |1       |
|V     |V         |2       |
|C     |D         |2       |
+------+----------+--------+

插入后HDFS中的关联目录结构:

# hdfs dfs -ls /user/hive/warehouse/adb.db/test/*
Found 2 items
-rwxrwx--x+  3 hive hive          4 2022-10-16 21:01 /user/hive/warehouse/adb.db/test/1/part-00000-5b5adcb6-15af-46d4-ba58-d35a4a43ac43.c000
-rwxrwx--x+  3 hive hive          4 2022-10-16 21:01 /user/hive/warehouse/adb.db/test/1/part-00001-5b5adcb6-15af-46d4-ba58-d35a4a43ac43.c000
Found 2 items
-rwxrwx--x+  3 hive hive          4 2022-10-16 21:01 /user/hive/warehouse/adb.db/test/2/part-00000-5b5adcb6-15af-46d4-ba58-d35a4a43ac43.c000
-rwxrwx--x+  3 hive hive          4 2022-10-16 21:01 /user/hive/warehouse/adb.db/test/2/part-00001-5b5adcb6-15af-46d4-ba58-d35a4a43ac43.c000
#

这(必须指定每个分区的位置)显然不是最优的,因此对于所有实际意图和目的,您希望保持标准 /partition_column=value 结构只是一个 s @AlexOtt 说。

【讨论】:

  • 我的源数据有成千上万的租户。所以像这样的预创建可能无法扩展,我对 spark 还很陌生,请帮助我理解这一点。是否可以编写自定义代码并实现这一目标?任何指导。
  • 好吧......我不明白为什么不能编写一个预先创建所有分区的脚本。这将是您摄取过程中的一个额外步骤,如果您选择更改为普遍接受的分区编码,则可以避免(由 Spark 本身透明地处理)。
  • 明白了,感谢您的回复,我们将集思广益。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 2023-03-23
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多