如何根据索引从另一个数据集更新数据集行

时间:2021-05-25 15:04:04

标签: apache-spark pyspark apache-spark-sql

我想根据这些行的索引用另一个数据集的行更新一个数据集的行,这些索引是在代码中指定的,我有以下代码可以工作:

for (int j = 0; j < dFInitIdx.count(); j++) {
            dFIdx = dFIdxCopy;
            addedInt = relationWithMarkets(j);
            if (addedInt < n) {
                for (String colName : dFInitIdx.columns())
                    if (colName != "id")
                        dFIdx = dFIdx.where(col("id").equalTo(addedInt )).withColumn(colName, dFInitIdx.where(col("id").equalTo(j)).col(colName));
               
                listRows.add(dFIdx);

            }
        }
        for (Dataset<Row> rowDs : listRows) {
            dFIdxCopy = dFIdxCopy.where(col("id").notEqual(rowDs.select("id").first().getLong(0)));
            dFIdxCopy = dFIdxCopy.union(rowDs);
        }

基本上这段代码的作用是,如果您有两个数据集和两个行索引,那么它将用第二个数据集的第二个索引处的行更新第一个数据集的第一个索引处的行,以下是一个示例:< /p>

 1) +---+--------+---------+
    | id| Market |   Food  |
    +---+--------+---------+
    |  1|     A  |     S   |
    |  2|     E  |     B   |
    |  3|     B  |     C   |
    +---+--------+---------+
    
2)  +---+--------+---------+
    | id| Market |   Food  |
    +---+--------+---------+
    |  1|     S  |     O   |
    |  2|     E  |     I   |
    |  3|     N  |     P   |
    +---+--------+---------+

那么如果第一个数据集(代码中的addedInt)的第一个索引(代码中的dFIdx)是1,第二个索引(代码中的j)数据集 2 的代码)(代码中的 dFInitIdx)是 3 那么结果数据集将是:

    +---+--------+---------+
    | id| Market |   Food  |
    +---+--------+---------+
    |  1|     A  |     S   |
    |  2|     E  |     B   |
    |  3|     N  |     P   |
    +---+--------+---------+

我的问题是:这是通过 listRows.add(dFIdx); 来做的好方法吗,尤其是如果数据集很大,否则有人可以提出使用 map() 或其他原生 spark 方法(不是 {{1} }} 尽管) PS:我还尝试在 join 列上使用函数 when 来检查当前索引,但它会产生属性错误。 谢谢。

0 个答案:

没有答案
相关问题