添加基于字典的PySpark列,其中键是元组

zqry0prt  于 2022-11-01  发布在  Spark
关注(0)|答案(1)|浏览(146)

我 有 下面 的 python 字典 :

ranges = {
    (0, 10): '0 - 10',
    (10, 100): '10 - 100',
    (100, float('inf')): '100+'
}

中 的 每 一 个
和 下面 的 df :
| 识别 码|数值|
| - -| - -|
| 第 001 章|九 个|
| 002 年|10 个|
| 003 年|三百 个|
我 想 添加 一 个 列 , 如果 " Value " 列 介于 ( 不 包括 ) 字典 键 中 的 两 个 数字 之间 , 则 该 列 返回 字典 的 值 。
因此 , 生成 的 df 应该 如下 所 示 :
| 识别 码|数值|范围|
| - -| - -| - -|
| 第 001 章|九 个|0 - 10 岁|
| 002 年|10 个|10 - 100 个|
| 003 年|三百 个|100 个 以上|
我 知道 我 可以 使用 withColumn 和 when , 例如 :

df.withColumn(
    'Range',
     .when((col('Value') >= lit(0)) & (col('Value') < lit(10)), '0 - 10')
)

格式
或者 希望 在 键 中 使用 不同 的 数字 进行 测试 , 这 将 是 低效 的 。
希望 这 是 有 意义 的 。 我 将 感谢 任何 和 所有 的 投入 。 提前 感谢 你 这么 多 。

t98cgbkg

t98cgbkg1#

字典可以转换为SQL表达式:

range_expr='case '
for r, label  in ranges.items():
    range_expr += f'when value >= {r[0]} '
    if r[1] != float('inf'):
      range_expr += f'and value < {r[1]} '
    range_expr += f'then "{label}" '
range_expr += 'end'

range_expr现在的值为

case when value >= 0 and value < 10 then "0 - 10" when value >= 10 and value < 100 then "10 - 100" when value >= 100 then "100+" end

并且可以用于构造新的列:

from pyspark.sql import functions as F

df.withColumn('range', F.expr(range_expr)).show()

输出量:

+---+-----+--------+
| id|value|   range|
+---+-----+--------+
|001|    9|  0 - 10|
|002|   10|10 - 100|
|003|  300|    100+|
+---+-----+--------+

相关问题