Considérez que j’ai une liste de paires valeur/clé du dictionnaire python, où la clé correspond au nom de colonne d’une table. Par conséquent, pour la liste ci-dessous, comment la convertir en pfrp dataframe avec deux colonnes arg1 arg2?
[{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""}]
Comment puis-je utiliser la construction suivante pour le faire?
df = sc.parallelize([
...
]).toDF
Où placer arg1 arg2 dans le code ci-dessus (...)
Ancienne façon:
sc.parallelize([{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""}]).toDF()
Nouvelle façon:
from pyspark.sql import Row
from collections import OrderedDict
def convert_to_row(d: dict) -> Row:
return Row(**OrderedDict(sorted(d.items())))
sc.parallelize([{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""}]) \
.map(convert_to_row) \
.toDF()
J'ai dû modifier la réponse acceptée pour que cela fonctionne pour moi dans Python 2.7 sous Spark 2.0.
from collections import OrderedDict
from pyspark.sql import SparkSession, Row
spark = (SparkSession
.builder
.getOrCreate()
)
schema = StructType([
StructField('arg1', StringType(), True),
StructField('arg2', StringType(), True)
])
dta = [{"arg1": "", "arg2": ""}, {"arg1": "", "arg2": ""}]
dtaRDD = spark.sparkContext.parallelize(dta) \
.map(lambda x: Row(**OrderedDict(sorted(x.items()))))
dtaDF = spark.createDataFrame(dtaRdd, schema)