在列级上应用odmMap的pyspark

izj3ouym  于 2022-11-16  发布在  Apache
关注(0)|答案(1)|浏览(67)

我有以下2个 Dataframe ,我想应用类似的条件,并返回pysark Dataframe 中的值。
df1.show网址:)

+---+-------+--------+
|id |tr_type|nominal |
+---+-------+--------+
|1  |K      |2.0     |
|2  |ZW     |7.0     |
|3  |V      |12.5    |
|4  |VW     |9.0     |
|5  |CI     |5.0     |
+---+-------+--------+

一维Map:* 缩写

+-------+------------+------------+-----------+
|odm_id |return_value|odm_relation|input_value|
+-------+------------+------------+-----------+
|abcefgh|B           |EQ          |K          |
|abcefgh|B           |EQ          |ZW         |
|abcefgh|S           |EQ          |V          |
|abcefgh|S           |EQ          |VW         |
|abcefgh|I           |EQ          |CI         |
+-------+------------+------------+-----------+

我需要应用以下条件当有卖出交易时,名义成交量被否定。
如果(tr_type,$abcefgh.)== 'S',则:标称= -标称;
预期输出:

+---+-------+-------+-----------+
|id |tr_type|nominal|nominal_new|
+---+-------+-------+-----------+
|1  |K      |2.0    |2.0        |
|2  |ZW     |7.0    |7.0        |
|3  |V      |12.5   |-12.5      |
|4  |VW     |9.0    |-9.0       |
|5  |CI     |5.0    |5.0        |
+---+-------+-------+-----------+
hkmswyz6

hkmswyz61#

您可以对tr_type == input_value上的2个 Dataframe 执行join操作,并使用when().otherwise()创建新列。
请参阅下面使用您的示例的示例

data_sdf. \
    join(odm_sdf.selectExpr('return_value', 'input_value as tr_type').
         dropDuplicates(), 
         ['tr_type'], 
         'left'
         ). \
    withColumn('nominal_new', 
               func.when(func.col('return_value') == 'S', func.col('nominal') * -1).
               otherwise(func.col('nominal'))
               ). \
    drop('return_value'). \
    show()

# +-------+---+-------+-----------+
# |tr_type| id|nominal|nominal_new|
# +-------+---+-------+-----------+
# |      K|  1|    2.0|        2.0|
# |     CI|  5|    5.0|        5.0|
# |      V|  3|   12.5|      -12.5|
# |     VW|  4|    9.0|       -9.0|
# |     ZW|  2|    7.0|        7.0|
# +-------+---+-------+-----------+

相关问题