使用一个表更新火花中的另一个表

Posted

技术标签:

【中文标题】使用一个表更新火花中的另一个表【英文标题】:using one table to update another table in spark 【发布时间】:2016-10-11 08:53:06 【问题描述】:

我有两张表或dataframes,我想用一张来更新另一张。我也知道 spark sql 不支持update a set a.1= b.1 from b where a.2 = b.2 and a.update < b.update。 请建议我如何实现这一点,因为这在 spark 中是不可能的。

表1

+------+----+------+
|number|name|update|
+------+--- -------+
|     1|   a| 08-01|
|     2|   b| 08-02|
+------+----+------+

表2

    +------+----+------+
    |number|name|update|
    +------+--- -------+
    |     1|  a2| 08-03|
    |     3|   b| 08-02|
    +------+----+------+

我想得到这个:

    +------+----+------+
    |number|name|update|
    +------+--- -------+
    |     1|  a2| 08-03|
    |     2|   b| 08-02|
    |     3|   b| 08-02|
    +------+----+------+

在 spark 中还有其他方法可以做到这一点吗?

【问题讨论】:

【参考方案1】:

使用pyspark,您可以使用subtract() 来查找table1number 值在table2 中不存在,然后使用两个表中的unionAll,其中table1 被过滤为来自table2 的缺失观察。

diff = (table1.select('number')
        .subtract(table2.select('number'))
        .rdd.map(lambda x: x[0]).collect())

table2.unionAll(table1[table1.number.isin(diff)]).orderBy('number').show()
+------+----+------+
|number|name|update|
+------+----+------+
|     1|  a2| 08-03|
|     2|   b| 08-02|
|     3|   b| 08-02|
+------+----+------+

【讨论】:

谢谢!不过我用过spark-shell~~

以上是关于使用一个表更新火花中的另一个表的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用火花流传输数据库表数据

平面文件(orc,csv)比火花中的增量表更有效吗

有没有一种很好的方法可以用换表加入火花流?

将分区(火花)镶木地板加载到 bigquery 表

有没有办法将数据帧的一列中的所有行与另一个数据帧的另一列(火花)中的所有行进行比较?

在火花中创建表需要很多时间