Реализация defaultdict в pyspark - PullRequest
0 голосов
/ 03 апреля 2020

Кто-нибудь знает, как реализовать какой-то эквивалент defaultdict в pyspark? Пока у меня есть

import pyspark.sql.functions as F
import pandas as pd
from itertools import chain
from collections import defaultdict

example_dict = defaultdict(
                    lambda: "Unmapped",
                    {"zero": 0,
                     "one": 1,
                     "two": 2})

mapping = F.create_map([F.lit(x) for x in chain(*example_dict.items())])

d = {'col1': [0, 1, 2, 3]}
df = pd.DataFrame(data=d)

dfs = spark.createDataFrame(df).withColumn("map", mapping.getItem(F.col("col1")))
dfs.show()

+----+-----+
|col1|  map|
+----+-----+ 
|   0| null|
|   1|  one|
|   2|  two|
|   3|three|
+----+-----+

, и, по-видимому, опция по умолчанию не работает должным образом, однако, если я применяю это к pandas фрейму данных, он работает нормально:

df["map"] = df["col1"].map(example_dict)

    col1    map
0   0       Unmapped
1   1       one
2   2       two
3   3       three

Я не уверен, что это потому, что pyspark не поддерживает defaultdict или я допустил ошибку в реализации.

...