从技术上讲,您可以通过使用 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 说。