【发布时间】:2019-12-27 20:41:34
【问题描述】:
下面是我的 Hive 表定义:
CREATE EXTERNAL TABLE IF NOT EXISTS default.test2(
id integer,
count integer
)
PARTITIONED BY (
fac STRING,
fiscaldate_str DATE )
STORED AS PARQUET
LOCATION 's3://<bucket name>/backup/test2';
我在 hive 表中有如下数据,(我只是插入了示例数据)
select * from default.test2
+---+-----+----+--------------+
| id|count| fac|fiscaldate_str|
+---+-----+----+--------------+
| 2| 3| NRM| 2019-01-01|
| 1| 2| NRM| 2019-01-01|
| 2| 3| NRM| 2019-01-02|
| 1| 2| NRM| 2019-01-02|
| 2| 3| NRM| 2019-01-03|
| 1| 2| NRM| 2019-01-03|
| 2| 3|STST| 2019-01-01|
| 1| 2|STST| 2019-01-01|
| 2| 3|STST| 2019-01-02|
| 1| 2|STST| 2019-01-02|
| 2| 3|STST| 2019-01-03|
| 1| 2|STST| 2019-01-03|
+---+-----+----+--------------+
此表在两列(fac、fictiondate_str)上分区,我们正在尝试通过使用 spark 数据帧 - 数据帧编写器在分区级别动态执行插入覆盖。
但是,在尝试此操作时,我们要么得到重复数据,要么所有其他分区都被删除。
以下是使用 spark 数据帧的代码 sn-ps。
首先我将数据框创建为
df = spark.createDataFrame([(99,99,'NRM','2019-01-01'),(999,999,'NRM','2019-01-01')], ['id','count','fac','fiscaldate_str'])
df.show(2,False)
+---+-----+---+--------------+
|id |count|fac|fiscaldate_str|
+---+-----+---+--------------+
|99 |99 |NRM|2019-01-01 |
|999|999 |NRM|2019-01-01 |
+---+-----+---+--------------+
-
使用下面的 sn-p 得到重复,
df.coalesce(1).write.mode("overwrite").insertInto("default.test2")
-
所有其他数据都被删除,只有新数据可用。
df.coalesce(1).write.mode("overwrite").saveAsTable("default.test2")
或
df.createOrReplaceTempView("tempview")
tbl_ald_kpiv_hist_insert = spark.sql("""
INSERT OVERWRITE TABLE default.test2
partition(fac,fiscaldate_str)
select * from tempview
""")
我将 AWS EMR 与 Spark 2.4.0 和 Hive 2.3.4-amzn-1 以及 S3 一起使用。
谁能知道为什么我不能将数据动态覆盖到分区中?
【问题讨论】:
-
你可以尝试设置下面的属性。 spark.conf.set("spark.sql.sources.partitionOverwriteMode","dynamic")
标签: apache-spark hive pyspark apache-spark-sql partition