【问题标题】:Delete/Update partition with sparklyr [duplicate]使用 sparklyr 删除/更新分区 [重复]
【发布时间】:2018-07-05 16:09:10
【问题描述】:

我正在使用 sparklyr 的 spark_write_table 函数将表写入 HDFS,使用 partition_by 参数定义如何存储它们:

 R> my_table %>% 
       spark_write_table(., 
             path="mytable",
             mode="append",
             partition_by=c("col1", "col2")
        )

但是,现在我想通过只更改一个分区来更新表,而不是再次写入整个表。

在 Hadoop-SQL 中,我会执行以下操作:

INSERT INTO TABLE mytable
PARTITION (col1 = 'my_partition')
VALUES (myvalues..)

在 sparklyr 中是否有等效的选项可以正确执行此操作?我在文档中找不到它。

重复说明:这个问题是关于在 R 中使用 sparklyr 函数执行此操作的方法,而另一个问题是关于一般 Hive 语法

【问题讨论】:

  • 我不确定这是否在sparkr 中可用,所以可能不在sparklyr 中,因为它是一个包装器。
  • 唯一的解决方案(通常使用 spark)可能是写入分区目录。
  • @eliasah 谢谢,但我认为 sparklyr 没有选择,我将不得不直接使用 SQL。将分区保存到临时表,然后调用 INSERT INTO TABLE mytable PARTITION。
  • 我认为它不会像你所说的那样与 Metastore 一起使用 @user8371915
  • 对不起,但我不认为这个问题是重复的,因为我明确地询问如何在 R 中使用 sparklyr 做到这一点。另一个链接的问题是关于如何在 Spark 中做到这一点,但我用 tidyverse 动词询问它。

标签: r hadoop apache-spark sparklyr hadoop-partitioning


【解决方案1】:

感谢所有cmets。

似乎没有办法直接用 sparklyr 做到这一点,但这就是我要做的。

简而言之,我会将新的分区文件保存在临时表中,使用 Hadoop SQL 命令删除分区,然后将另一个 SQL 命令插入到临时表中。

> dbGetQuery(con, 
   "ALTER TABLE mytable DROP IF EXISTS PARTITION (mycol='partition1');")

> spark_write_table(new_partition, "tmp_partition_table")

> dbGetQuery(con, 
      "INSERT VALUES INTO TABLE mytable
       PARTITION (mycol='partition1') 
       SELECT * 
       FROM tmp_partition_table "
   )

【讨论】:

    猜你喜欢
    • 2020-04-29
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 2023-03-23
    • 2012-08-23
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多