【问题标题】:Pyspark subselect / subquery join using dataframes使用数据框的 Pyspark 子选择/子查询连接
【发布时间】:2021-03-02 05:32:26
【问题描述】:

我希望加入一个基于低于该值的最接近匹配的值。在 SQL 中,我可以很容易地做到这一点。考虑以下数据:

tblActuals

|Date       |Temperature:
|09/02/2020 |14.1
|10/02/2020 |15.3
|11/02/2020 |12.2
|12/02/2020 |12.4
|13/02/2020 |12.5
|14/02/2020 |11
|15/02/2020 |14.6

tbl系数:

|Metric |Coefficient
|10.5   |0.997825593
|11     |0.997825593
|11.5   |0.997663198
|12     |0.997307614
|12.5   |0.996848773
|13     |0.996468537
|13.5   |0.99638519
|14     |0.996726301
|14.5   |0.997435894
|15     |0.998311153
|15.5   |0.999135509

在 SQL 中,我可以通过以下方式实现加入:

Select 
    a.date, 
    b.temperature, 
    (select top 1 b.Coefficient from tblCoefficients b where b.Metric <= a.Temperature order by b.Metric desc) as coefficient 
from tblActuals

有没有什么方法可以通过两个 pyspark 数据帧中的数据实现与上述相同的效果?我可以在 spark SQL 中获得类似的结果,但我需要数据帧的灵活性来实现我在数据块中创建的过程。

【问题讨论】:

    标签: python dataframe apache-spark pyspark


    【解决方案1】:

    您可以进行连接并获得最大(最接近)指标的系数:

    import pyspark.sql.functions as F
    
    result = tblActuals.join(
        tblCoefficients,
        tblActuals['Temperature'] >= tblCoefficients['Metric']
    ).groupBy(tblActuals.columns).agg(
        F.max(F.struct('Metric', 'Coefficient'))['Coefficient'].alias('coefficient')
    )
    
    result.show()
    +----------+-----------+-----------+
    |      Date|Temperature|coefficient|
    +----------+-----------+-----------+
    |15/02/2020|       14.6|0.997435894|
    |12/02/2020|       12.4|0.997307614|
    |14/02/2020|       11.0|0.997825593|
    |13/02/2020|       12.5|0.996848773|
    |11/02/2020|       12.2|0.997307614|
    |10/02/2020|       15.3|0.998311153|
    |09/02/2020|       14.1|0.996726301|
    +----------+-----------+-----------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2015-05-24
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      相关资源
      最近更新 更多