Pyspark 如何使用dict创建新的数据帧
我有一个Pyspark 如何使用dict创建新的数据帧,pyspark,Pyspark,我有一个dict,比如: cMap = {"k1" : "v1", "k2" : "v1", "k3" : "v2", "k4" : "v2"} +---+ |key| +---- | k1| | k2| | k3| | k4| +---+ 一个数据帧A,如: cMap = {"k1" : "v1", "k2" : "v1", "k3" : "v2", "k4" : "v2"} +---+ |key| +---- | k1| | k2| | k3| | k4| +---+ 要使用代码创建
dict
,比如:
cMap = {"k1" : "v1", "k2" : "v1", "k3" : "v2", "k4" : "v2"}
+---+
|key|
+----
| k1|
| k2|
| k3|
| k4|
+---+
一个数据帧A
,如:
cMap = {"k1" : "v1", "k2" : "v1", "k3" : "v2", "k4" : "v2"}
+---+
|key|
+----
| k1|
| k2|
| k3|
| k4|
+---+
要使用代码创建上面的DataFame,请执行以下操作:
data = [('k1'),
('k2'),
('k3'),
('k4')]
A = spark.createDataFrame(data, ['key'])
我想得到新的数据帧,比如:
+---+----------+----------+
|key| v1 | v2 |
+---+----------+----------+
| k1|true |false |
| k2|true |false |
| k3|false |true |
| k4|false |true |
+---+----------+----------+
我希望得到一些建议,谢谢 字典可以转换为数据帧并与另一个连接。我的代码
data = sc.parallelize([(k,)+(v,) for k,v in cMap.items()]).toDF(['key','val'])
keys = sc.parallelize([('k1',),('k2',),('k3',),('k4',)]).toDF(["key"])
newDF = data.join(keys,'key').select("key",F.when(F.col("val") == "v1","True").otherwise("False").alias("v1"),F.when(F.col("val") == "v2","True").otherwise("False").alias("v2"))
>>> newDF.show()
+---+-----+-----+
|key| v1| v2|
+---+-----+-----+
| k1| True|False|
| k2| True|False|
| k3|False| True|
| k4|False| True|
+---+-----+-----+
如果有更多的值,可以将when子句编码为UDF并使用它 I并行化
cMap.items()
并检查值是否等于v1
或v2
。然后在列key
# example dataframe A
df_A = spark.sparkContext.parallelize(['k1', 'k2', 'k3', 'k4']).map(lambda x: Row(**{'key': x})).toDF()
cmap_rdd = spark.sparkContext.parallelize(cMap.items())
cmap_df = cmap_rdd.map(lambda x: Row(**dict([('key', x[0]), ('v1', x[1]=='v1'), ('v2', x[1]=='v2')]))).toDF()
df_A.join(cmap_df, on='key').orderBy('key').show()
数据帧
+---+-----+-----+
|key| v1| v2|
+---+-----+-----+
| k1| true|false|
| k2| true|false|
| k3|false| true|
| k4|false| true|
+---+-----+-----+
谢谢大家的建议,我找到了解决pivot问题的另一种方法,代码是:
cMap = {"k1" : "v1", "k2" : "v1", "k3" : "v2", "k4" : "v2"}
a_cMap = [(k,)+(v,) for k,v in cMap.items()]
data = spark.createDataFrame(a_cMap, ['key','val'])
from pyspark.sql.functions import count
data = data.groupBy('key').pivot('val').agg(count('val'))
data.show()
+---+----+----+
|key| v1| v2|
+---+----+----+
| k2| 1|null|
| k4|null| 1|
| k1| 1|null|
| k3|null| 1|
+---+----+----+
data = data.na.fill(0)
data.show()
+---+---+---+
|key| v1| v2|
+---+---+---+
| k2| 1| 0|
| k4| 0| 1|
| k1| 1| 0|
| k3| 0| 1|
+---+---+---+
keys = spark.createDataFrame([('k1','2'),('k2','3'),('k3','4'),('k4','5'),('k5','6')], ["key",'temp'])
newDF = keys.join(data,'key')
newDF.show()
+---+----+---+---+
|key|temp| v1| v2|
+---+----+---+---+
| k2| 3| 1| 0|
| k4| 5| 0| 1|
| k1| 2| 1| 0|
| k3| 4| 0| 1|
+---+----+---+---+
但是,我无法将1转换为true,将0转换为false。我只是想提供一种不同的、可能更简单的方法来解决这个问题 在我的代码中,我将dict转换为pandas数据帧,我发现这要容易得多。然后我直接将pandas数据帧转换为spark
data = {'visitor': ['foo', 'bar', 'jelmer'],
'A': [0, 1, 0],
'B': [1, 0, 1],
'C': [1, 0, 0]}
df = pd.DataFrame(data)
ddf = spark.createDataFrame(df)
Output:
+---+---+---+-------+
| A| B| C|visitor|
+---+---+---+-------+
| 0| 1| 1| foo|
| 1| 0| 0| bar|
| 0| 1| 0| jelmer|
+---+---+---+-------+
我只是想添加一种使用pyspark创建DF的简单方法
values = [("K1","true","false"),("K2","true","false")]
columns = ['Key', 'V1', 'V2']
df = spark.createDataFrame(values, columns)
事实上,还有更多的值,你能告诉我如何构造UDF吗?虽然这段代码可以回答这个问题,但我建议你至少对它进行一些简单的解释。我也发现这个答案非常有用,但是如果你能解释什么是“sc”或“spark”,那就太好了。对于不完整的定义,我感到非常抱歉,我已经更新了答案我想现在这应该可以解决疑问了,