【问题标题】:Creating a bidimensional array with Spark (pyspark)使用 Spark (pyspark) 创建二维数组
【发布时间】:2018-03-30 22:10:18
【问题描述】:

在 Spark 中使用 Python 2.7, 我有两个二维点列表。列表 An 个点,列表 Bm 个点。 每个点由 2 个元素(x 和 y 坐标)的列表表示:

set_a = [[x1, y1], [x2, y2], ..., [xn, yn]]
set_b = [[x1, y1], [x2, y2], ..., [xm, ym]]

我想构建一个n*m 矩阵M,其中通用元素M[i][j] 包含A 中的点与索引i 和 B 中索引为 j 的点。我不是在谈论欧几里得距离,但我有我的personal_distance_function(point_a, point_b),我想用它来构建M

在纯 Python 2.7 中,我目前正在做这样的事情:

for i in range(len(A)):
    for j in range(len(B)):
        M[i, j] = personal_distance_function(A[i], B[j])

...但是由于我需要使用 pyspark 执行此操作,您对如何使用 SparkContext 执行此操作有什么建议吗?

【问题讨论】:

    标签: python arrays apache-spark pyspark


    【解决方案1】:

    首先,您需要将列表转换为数据框:

    >>> df_a = spark.createDataFrame(set_a, ['a_x', 'a_y'])
    >>> df_b = spark.createDataFrame(set_b, ['b_x', 'b_y'])
    

    然后你需要创建一个UDF(用户定义函数)来在spark中注册你的函数:

    >>> from pyspark.sql.functions import udf, struct
    >>> from pyspark.sql.types import DoubleType
    >>> dist = udf(personal_distance_function, DoubleType())
    

    最后,您可以使用简单的 spark 代码交叉连接两个数据帧并在它们上执行距离函数:

    >>> df_a.crossJoin(df_b) \
          .withColumn('dist', dist(struct('a_x', 'a_y'), struct('b_x', 'b_y'))).show()
    

    【讨论】:

    • 感谢您的回答,但我仍然没有得到任何信息:我从哪里获得用于创建数据框的“spark”对象?我试图实例化 SparkContext,但它说没有定义 createDataFrame() 方法。
    • spark 是对 spark 上下文的引用,适用于 pyspark shell 中 >=2.0 的版本。如果您使用的是 spark spark 替换为 sqlContext
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2016-12-27
    • 2013-07-16
    • 1970-01-01
    • 2011-10-19
    相关资源
    最近更新 更多