我想知道如何映射数据框中特定列中的值。
我有一个看起来像的数据框:
df = sc.parallelize([('india','japan'),('usa','uruguay')]).toDF(['col1','col2'])
+-----+-------+
| col1| col2|
+-----+-------+
|india| japan|
| usa|uruguay|
+-----+-------+
我有一本我想映射值的字典。
dicts = sc.parallelize([('india','ind'), ('usa','us'),('japan','jpn'),('uruguay','urg')])
我想要的输出是:
+-----+-------+--------+--------+
| col1| col2|col1_map|col2_map|
+-----+-------+--------+--------+
|india| japan| ind| jpn|
| usa|uruguay| us| urg|
+-----+-------+--------+--------+
我试过使用 lookup function
但它不起作用。它抛出错误 SPARK-5063。以下是我失败的方法:
def map_val(x):
return dicts.lookup(x)[0]
myfun = udf(lambda x: map_val(x), StringType())
df = df.withColumn('col1_map', myfun('col1')) # doesn't work
df = df.withColumn('col2_map', myfun('col2')) # doesn't work
原文由 YOLO 发布,翻译遵循 CC BY-SA 4.0 许可协议
udf方式
我建议您将 元组列表更改为字典 并将其 广播 以 在 udf 中使用
哪个应该给你
加入方式(比udf方式慢)
您所要做的就是 将 dicts rdd 也更改为 dataframe 并 使用两个 带有 别名 的连接,如下所示
这应该给你相同的结果