【问题标题】:combining rows/columns from spark data frames by mathematical operation通过数学运算组合来自 Spark 数据帧的行/列
【发布时间】:2015-05-04 20:26:12
【问题描述】:

我有两个 spark 数据帧(A 和 B),大小分别为 a x m 和 b x m,包含浮点值。 此外,每个数据框都有一个“ID”列,即字符串标识符。 A 和 B 具有完全相同的“ID”集(即包含有关同一组客户的信息。)

我想通过某个函数将 A 列与 B 列结合起来。 更具体地说,我想构建一个标量产品,A 列和 B 列,并根据 ID 对列进行排序。 更具体地说,我想计算 A 列和 B 列之间的相关性。 对所有列对执行此操作与矩阵乘法相同:A_transposed x B。 但是,目前我只对一小部分对的相关性感兴趣。

我有两种方法,但我很难实施。 (而且根本不知道是否可行或可取。)

(1) 取出每个数据帧的感兴趣的列,将每个条目组合成一个键值对,其中键是ID。然后对两列键值对和后续求和类似 reduceByKey()。

(2) 获取每个数据帧的感兴趣列,按其 ID 对其进行排序,将其转换为 RDD(尚未弄清楚如何执行此操作)并简单地应用 来自 pyspark.mllib.stat 的 Statistics.corr(rdd1,rdd2)。

我还想知道:在计算上通常是对列进行操作而不是对行进行操作(因为 spark 数据帧是面向列的)还是没有区别?

【问题讨论】:

  • 你的意思是要equal join按客户ID的两个数据框?
  • 是的,我认为这将是实现我所寻找的一种方式。同样关于这一点,如果有人可以评论我的最后一个问题,我会很高兴。
  • 在列上操作或在行上操作都是我认为的您的要求。在数据分析的情况下,通常情况下表很宽,即有很多列,但是在处理单个查询时,只有很少的列(或字段)被认为是有用的,也许这就是你的意思@ 987654322@?
  • 假设我想在我的数据集的列(行)上计算一些统计数据。我想知道数据是如何在我的集群中分布的。我可以将其视为在某个节点上实现的某些列(行)吗?如果是这种情况,如果所有必要的数据,即特定列(行)存在于一个节点上,我希望我的计算会快得多。否则计算将需要大量改组。还是数据的物理分布与数据框的结构无关?
  • 数据被条带化到行组并分布在整个集群中。你可以认为你在一张大桌子上操作,桌子被分成许多包含部分行的平板电脑,所有平板电脑一起组成了整个桌子。当你对表进行查询时,它实际上确实会进行两步计算,首先,在本地节点,将逐行读取tablet,进行过滤,选择一些需要的列并保存为本地文件,请注意在本地文件中,您查询的不需要的列甚至不存在;第二步是先打乱所有本地文件

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


【解决方案1】:

从 spark 1.4 开始,如果您只需要 pearson 相关性,那么您可以这样:

cor = dfA.join(dfB, dfA.id == dfB.id, how='inner').select(dfA.value.alias('aval'), dfB.value.alias('bval')).corr('aval', 'bval')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-14
    • 2019-02-27
    • 2016-12-12
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多