【问题标题】:Add values in two Spark DataFrames, row by row在两个 Spark DataFrame 中逐行添加值
【发布时间】:2019-11-18 20:11:52
【问题描述】:

我有两个 Spark DataFrame,它们的值要相加,然后相乘,并且只保留最低的一对值。我写了一个函数可以做到这一点:

math_func(aValOne, aValTwo, bValOne, bValTwo):
    tmpOne = aValOne + bValOne
    tmpTwo = aValTwo + bValTwo
    final = tmpOne*tmpTwo
    return final

我想逐行遍历两个 Spark DataFrame,“A”和“B”,并保留最低值的结果。因此,如果我有两个 DataFrame:

DataFrameA:
ID | ValOne | ValTwo
0  | 2      | 4
1  | 3      | 6

DataFrameB:
ID | ValOne | ValTwo
0  | 4      | 5
1  | 7      | 9

我想先从DataFrameA:中取出第0行,与DataFrameB的第0行和第1行进行比较,然后保留最低值的结果。我试过这个:

results = DataFrameA.select('ID')(lambda i: DataFrameA.select('ID')(math_func(DataFrameA.ValOne, DataFrameA.ValTwo, DataFrameB.ValOne, DataFrameB.ValOne))

但我收到有关遍历 DataFrame 列的错误。我知道在 Pandas 中我基本上会创建一个嵌套的“for 循环”,然后将结果写入另一个 DataFrame 并附加结果。我期望的结果是:

Initial Results:
DataFrameA_ID | Value | DataFrameB_ID
0             | 54    | 0 
0             | 117   | 1    
1             | 77    | 0
1             | 150   | 1

Final Results:
DataFrameA_ID | Value | DataFrameB_ID
0             | 54    | 0    
1             | 77    | 0

我是 Spark 的新手,但我知道我没有以正确的方式解决这个问题。

有什么想法可以解决这个问题吗?

【问题讨论】:

  • 这是否意味着如果您在 A 中有 m 行,在 B 中有 n,那么您将执行 m*n 操作?你也可以用预期的输出来更新你的问题吗?
  • 是的,没错。我知道计算复杂度有点高,但我没有看到任何其他方法。
  • @Amit 我在预期的最终结果中添加了

标签: python dataframe apache-spark


【解决方案1】:

您将需要多个步骤来实现这一点。

假设你有数据

DFA:
ID | ValOne | ValTwo
0  | 2      | 4
1  | 3      | 6

DFB:
ID | ValOne | ValTwo
0  | 4      | 5
1  | 7      | 9

第 1 步。 在您的 2 个数据帧上执行 cartesian 连接。这会给你:

Cartesian:
DFA.ID | DFA.ValOne | DFA.ValTwo | DFB.ID | DFB.ValOne | DFB.ValTwo
0      | 2          | 4          | 0      |          4 | 5
1      | 3          | 6          | 0      |          4 | 5 
0      | 2          | 4          | 1      |          7 | 9
1      | 3          | 6          | 1      |          7 | 9

第 2 步。

乘以列:

    Multiplied:
    DFA.ID | DFA.Mul | DFB.ID | DFB.Mul
    0      | 8       | 0      |     20
    1      | 18      | 0      |     20 
    0      | 8       | 1      |     63
    1      | 18      | 1      |     63

第 3 步。DFA.ID 分组并从DFA.MulDFB.Mul 中选择最小值

【讨论】:

  • 我认为在此处添加您用来实现此结果的代码会更好。尤其是因为 OP 说他们对 Spark 很陌生。
  • 我实际上最终独立完成了这件事!谢谢@Vladislav,我很高兴我的方法得到了验证。感谢您花时间和精力回答我的问题!
猜你喜欢
  • 2022-11-08
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 2016-08-16
  • 2016-01-07
  • 2021-05-08
  • 1970-01-01
相关资源
最近更新 更多