使用Spark 1.6,我有一个Spark DataFrame column
(命名为col1
),其值分别为A,B,C,DS,DNS,E,F,G和H,我想col2
使用dict
下面的值创建一个新列(例如),我该如何映射?(因此fi’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,Spark <3.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]
在 Spark中, > = 3.0 getItem
应替换为__getitem__
([]
),即:
df.withColumn("value", mapping_expr[col("key")]).show()
问题内容: 我想用Python建立字典。但是,我看到的所有示例都是从列表中实例化字典等。.. 如何在Python中创建一个新的空字典? 问题答案: 无参数调用 或简单地写
问题内容: 给定一个字典,我想提供一个函数。 有内置功能吗?还是我必须做 理想情况下,我只会写 要么 也就是说,对原始词典进行了突变还是创建副本对我来说都没有关系。 问题答案: 没有这样的功能;最简单的方法是使用dict理解: 在python 2.7中,请使用方法而不是节省内存。dict理解语法直到python 2.7才引入。 注意,列表上也没有这种方法。您将不得不使用列表推导或函数。 这样,您也
映射或字典类型,一种键值对的映射关系存储结构。定义方式为mapping(_KeyType => _KeyValue)。键的类型允许除映射外的所有类型,如数组,合约,枚举,结构体。值的类型无限制。 映射可以被视作为一个哈希表,其中所有可能的键已被虚拟化的创建,被映射到一个默认值(二进制表示的零)。但在映射表中,我们并不存储键的数据,仅仅存储它的keccak256哈希值,用来查找值时使用。 因此,映射
本文向大家介绍dart 创建一个新映射,包括了dart 创建一个新映射的使用技巧和注意事项,需要的朋友参考一下 示例 可以通过多种方式创建映射。 使用构造函数,您可以创建一个新的映射,如下所示: 键和值的类型也可以使用泛型定义: 否则,可以使用映射文字创建映射:
问题内容: 我是Elasticsearch的新手,目前正在实现用于搜索的过滤器。到目前为止,我的索引具有以下映射(我已经删除了一些字段): geo_distance字段将在location字段上实现,示例实例如下所示: 即采用geoJSON格式。 我了解我将必须更新索引,以使location字段的类型为,如文档(mapping-geo- point )中所述。似乎我必须删除索引并创建一个新索引,但
如何将一个新的列事件添加到数据帧中,该事件将是< code>generate_header的结果?如何添加一行作为列值? 可能我们需要将函数转换为UDF 假设我们有这样的东西 我们想得到这个