python – PySpark使用dict创建新列
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – PySpark使用dict创建新列,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1558字,纯文字阅读大概需要3分钟。
内容图文
![python – PySpark使用dict创建新列](/upload/InfoBanner/zyjiaocheng/708/85383c15a98b454c9bbd09c0902e12e7.jpg)
使用Spark 1.6,我有一个Spark DataFrame列(名为let,比如col1),其值为A,B,C,DS,DNS,E,F,G和H,我想用值创建一个新列(比如col2)从下面的词典中,我该如何映射? (所以f.i.’A’需要映射到’S’等……)
dict = {'A': 'S', 'B': 'S', 'C': 'S', 'DS': 'S', 'DNS': 'S', 'E': 'NS', 'F': 'NS', 'G': 'NS', 'H': 'NS'}
解决方法:
使用UDF的低效解决方案(版本无关):
from pyspark.sql.types import StringType
from pyspark.sql.functions import udf
def translate(mapping):
def translate_(col):
return mapping.get(col)
return udf(translate_, StringType())
df = sc.parallelize([('DS', ), ('G', ), ('INVALID', )]).toDF(['key'])
mapping = {
'A': 'S', 'B': 'S', 'C': 'S', 'DS': 'S', 'DNS': 'S',
'E': 'NS', 'F': 'NS', 'G': 'NS', 'H': 'NS'}
df.withColumn("value", translate(mapping)("key"))
结果:
+-------+-----+
| key|value|
+-------+-----+
| DS| S|
| G| NS|
|INVALID| null|
+-------+-----+
更高效(仅限Spark 2.0)是创建MapType文字:
from pyspark.sql.functions import col, create_map, lit
from itertools import chain
mapping_expr = create_map([lit(x) for x in chain(*mapping.items())])
df.withColumn("value", mapping_expr.getItem(col("key")))
结果相同:
+-------+-----+
| key|value|
+-------+-----+
| DS| S|
| G| NS|
|INVALID| null|
+-------+-----+
但更有效的执行计划:
== Physical Plan ==
*Project [key#15, keys: [B,DNS,DS,F,E,H,C,G,A], values: [S,S,S,NS,NS,NS,S,NS,S][key#15] AS value#53]
+- Scan ExistingRDD[key#15]
与UDF版本相比:
== Physical Plan ==
*Project [key#15, pythonUDF0#61 AS value#57]
+- BatchEvalPython [translate_(key#15)], [key#15, pythonUDF0#61]
+- Scan ExistingRDD[key#15]
内容总结
以上是互联网集市为您收集整理的python – PySpark使用dict创建新列全部内容,希望文章能够帮你解决python – PySpark使用dict创建新列所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。