pyspark中使用字典的快速方法

jtoj6r0c  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(468)

我有个关于皮斯帕克的问题。
我有两列“国家”和“网络”的数据框。我需要将这个dataframe保存为dictionary,以便稍后遍历另一个dataframe列。
我是这样救你的:

sorted_dict = result.rdd.sortByKey()

但当我尝试遍历它时,我有一个例外:
“似乎您正试图广播rdd或引用来自的rdd”异常:似乎您正试图广播rdd或引用来自操作或转换的rdd。rdd转换和操作只能由驱动程序调用,不能在其他转换内部调用;例如spark-5063
我知道我不能同时使用两个RDD,但不幸的是我不知道如何以这种方式使用sparkcontext.broadcast,因为我有一个错误
typeerror:broadcast()缺少2个必需的位置参数:“self”和“value”
有人能帮我弄清楚吗?我需要从Dataframe生成字典:

+--------------------+-------+
|                 web|country|
+--------------------+-------+
|   alsudanalyoum.com|     SD|
|periodicoequilibr...|     SV|
|  telesurenglish.net|     UK|
|         nytimes.com|     US|
|portaldenoticias....|     AR|
+----------------------------+

然后取另一个Dataframe:

+--------------------+-------+
|           split_url|country|
+--------------------+-------+
|   alsudanalyoum.com|   Null|
|periodicoequilibr...|   Null|
|  telesurenglish.net|   Null|
|         nytimes.com|   Null|
|portaldenoticias....|   Null|
+----------------------------+

... 把字典的值放到国家栏。
p、 因为其他原因,我不适合加入美国。

ipakzgxi

ipakzgxi1#

如果可以,你应该使用 join() ,但既然不能,就可以结合使用 df.rdd.collectAsMap() 以及 pyspark.sql.functions.create_map() 以及 itertools.chain 实现同样的目标。
注意: sortByKey() 不返回字典(或Map),而是返回排序的 RDD .

from itertools import chain
import pyspark.sql.functions as f

df = spark.createDataFrame([
   ("a", 5),
   ("b", 20),
   ("c", 10),
   ("d", 1),
], ["key", "value"])

# create map from the origin df

rdd_map = df.rdd.collectAsMap()

# yes, these are not real null values, but here it doesn't matter

df_target = spark.createDataFrame([
   ("a", "NULL"),
   ("b", "NULL"),
   ("c", "NULL"),
   ("d", "NULL"),
], ["key", "value"])

df_target.show()
+---+-----+
|key|value|
+---+-----+
|  a| NULL|
|  b| NULL|
|  c| NULL|
|  d| NULL|
+---+-----+

value_map = f.create_map(
    [f.lit(x) for x in chain(*rdd_map.items())]
)

# map over the "key" column into the "value" column

df_target.withColumn(
    "value",
    value_map[f.col("key")]
).show()
+---+-----+
|key|value|
+---+-----+
|  a|    5|
|  b|   20|
|  c|   10|
|  d|    1|
+---+-----+

相关问题