如何使用dict创建新的DataFrame

Iva*_*Lee 4 pyspark

我有一个dict,例如:

cMap = {"k1" : "v1", "k2" : "v1", "k3" : "v2", "k4" : "v2"}
Run Code Online (Sandbox Code Playgroud)

和一个DataFrame A,例如:

+---+
|key|
+----
| k1|
| k2|
| k3|
| k4|
+---+
Run Code Online (Sandbox Code Playgroud)

使用代码创建上面的DataFame:

data = [('k1'),
    ('k2'),
    ('k3'),
    ('k4')]
A = spark.createDataFrame(data, ['key'])
Run Code Online (Sandbox Code Playgroud)

我想获取新的DataFrame,例如:

+---+----------+----------+
|key|   v1     |    v2    |
+---+----------+----------+
| k1|true      |false     |
| k2|true      |false     |
| k3|false     |true      |
| k4|false     |true      |
+---+----------+----------+
Run Code Online (Sandbox Code Playgroud)

我希望得到一些建议,谢谢!

J. *_*erg 10

我只是想提供一种不同且可能更简单的方法来解决此问题。

在我的代码中,我将字典转换为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|
+---+---+---+-------+
Run Code Online (Sandbox Code Playgroud)


小智 7

我只是想添加一个简单的方法来创建 DF,使用 pyspark

values = [("K1","true","false"),("K2","true","false")]
columns = ['Key', 'V1', 'V2']
df = spark.createDataFrame(values, columns)
Run Code Online (Sandbox Code Playgroud)


Ind*_*uly 7

from pyspark import SparkContext,SparkConf

from pyspark.sql import SQLContext
sc = SparkContext()
spark = SQLContext(sc)
val_dict = {
            'key1':val1,
            'key2':val2,
            'key3':val3
            }

rdd = sc.parallelize([val_dict])

bu_zdf = spark.read.json(rdd)
Run Code Online (Sandbox Code Playgroud)

  • 虽然这段代码可以回答这个问题,但我建议您至少对其进行一些最小的解释。 (2认同)

Iva*_*Lee 3

感谢大家的一些建议,我想出了另一种方法来解决我的枢轴问题,代码是:

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|
+---+----+---+---+
Run Code Online (Sandbox Code Playgroud)

但是,我无法将 1 转换为 true,将 0 转换为 false。