2017-05-03 23 views
0

創建新的數據幀我有一個字典,如:如何使用字典

cMap = {"k1" : "v1", "k2" : "v1", "k3" : "v2", "k4" : "v2"} 

和一個數據幀A,像:

+---+ 
|key| 
+---- 
| k1| 
| k2| 
| k3| 
| k4| 
+---+ 

創建上面的代碼DataFame:

data = [('k1'), 
    ('k2'), 
    ('k3'), 
    ('k4')] 
A = spark.createDataFrame(data, ['key']) 

我想獲得新的DataFrame,例如:

+---+----------+----------+ 
|key| v1  | v2 | 
+---+----------+----------+ 
| k1|ture  |false  | 
| k2|ture  |false  | 
| k3|false  |ture  | 
| k4|false  |ture  | 
+---+----------+----------+ 

我希望得到一些建議,謝謝!

回答

0

感謝大家的一些建議,我想出其他辦法來解決我的支點的問題,代碼:

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。

3

該字典可以轉換爲數據框並與其他數據庫連接。我的一段代碼,

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並使用它。

+0

實際上,還有更多的價值,你能告訴我如何構建UDF嗎? –

1

我並行cMap.items()並檢查值是否等於v1v2或不。然後在列加盟回數據幀一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| 
+---+-----+-----+ 
0

我只是想提出一個不同的,可能更簡單的方法來解決這個問題。

在我的代碼中,我將一個字典轉換爲一個熊貓數據框,我發現它更容易。然後我直接將熊貓數據框轉換爲火花。

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| 
+---+---+---+-------+