【问题标题】:Pyspark Dataframe Apply function to two columnsPyspark Dataframe 将函数应用于两列
【发布时间】:2017-03-16 07:48:36
【问题描述】:

假设我有两个 PySpark DataFrames df1df2

df1=   'a' 
        1    
        2    
        5    

df2=   'b'
        3
        6

我想为每个df1['a'] 找到最接近的df2['b'] 值,并将最接近的值作为新列添加到df1 中。

换句话说,对于df1['a']中的每个值x,我想为所有y in df2['b']找到一个达到min(abx(x-y))y(注意:可以假设只有一个y可以达到最小距离),结果是

'a'    'b'
 1      3
 2      3
 5      6

我尝试使用以下代码首先创建一个距离矩阵(在找到达到最小距离的值之前):

from pyspark.sql.types import IntegerType
from pyspark.sql.functions import udf

def dict(x,y):
    return abs(x-y)
udf_dict = udf(dict, IntegerType())

sql_sc = SQLContext(sc)
udf_dict(df1.a, df2.b)

这给了

Column<PythonUDF#dist(a,b)>

然后我尝试了

sql_sc.CreateDataFrame(udf_dict(df1.a, df2.b))

它永远运行而不给出错误/输出。

我的问题是:

  1. 由于我是 Spark 新手,我构建输出 DataFrame 的方法是否有效? (我的方法是先为所有ab 值创建一个距离矩阵,然后找到min 一个)
  2. 我的代码的最后一行有什么问题以及如何修复它?

【问题讨论】:

    标签: pyspark spark-dataframe pyspark-sql


    【解决方案1】:

    从您的第二个问题开始 - 您只能将 udf 应用于现有数据框,我认为您正在考虑这样的事情:

    >>> df1.join(df2).withColumn('distance', udf_dict(df1.a, df2.b)).show()
    +---+---+--------+
    |  a|  b|distance|
    +---+---+--------+
    |  1|  3|       2|
    |  1|  6|       5|
    |  2|  3|       1|
    |  2|  6|       4|
    |  5|  3|       2|
    |  5|  6|       1|
    +---+---+--------+
    

    但是有一个更有效的方法来应用这个距离,通过使用内部abs

    >>> from pyspark.sql.functions import abs
    >>> df1.join(df2).withColumn('distance', abs(df1.a -df2.b))
    

    然后你可以通过计算找到匹配的数字:

    >>> distances = df1.join(df2).withColumn('distance', abs(df1.a -df2.b))
    >>> min_distances = distances.groupBy('a').agg(min('distance').alias('distance'))
    >>> distances.join(min_distances, ['a', 'distance']).select('a', 'b').show()
    +---+---+                                                                       
    |  a|  b|
    +---+---+
    |  5|  6|
    |  1|  3|
    |  2|  3|
    +---+---+
    

    【讨论】:

      猜你喜欢
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 2016-08-24
      • 2017-10-18
      • 2012-09-26
      • 1970-01-01
      • 2019-06-18
      相关资源
      最近更新 更多