web-dev-qa-db-fra.com

Convertir une liste de dictionnaires de valeurs de clés python standard en un cadre de données pyspark

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 (...)

5
stackit

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()
18
652bb3ca

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) 
1
JestonBlu