下面是我的配置单元表定义:
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,fiscaldate\u str),我们试图使用spark dataframes-dataframe writer在分区级别动态执行insert overwrite。
但是,在尝试此操作时,我们要么得到重复的数据,要么删除了所有其他分区。
下面是使用spark dataframe的代码片段。
首先,我创建dataframe作为
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 |
+---+-----+---+--------------+
正在获取以下代码段的副本,
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。
有人知道为什么我不能动态地将数据覆盖到分区中吗?
1条答案
按热度按时间np8igboo1#
你的问题不太容易理解,但我想你的意思是你想覆盖一个分区。如果是这样,那么这就是你所需要的,你所需要的——第二行:
注意:overwrite=true。由于正在使用df.writer,因此所做的评论既不在这里也不在那里。我不是在讨论联合(1)。
对询问者的评论
我在databricks笔记本上运行了我的标准操作(在这里进行原型设计和回答时),并明确设置了以下内容,效果很好:
您要求更新答案:
我能做我刚刚做的事;可能在你的环境中这是需要的,但我肯定不需要这样做。
更新19/3/20
这适用于以前的spark版本,现在是以下applie AFAIC:
从2.4.x开始一直这样。向前。