J'ai un rdd (on peut l'appeler myrdd) où chaque enregistrement dans le rdd est de la forme:
[('column 1',value), ('column 2',value), ('column 3',value), ... , ('column 100',value)]
Je voudrais convertir ceci en un DataFrame dans pyspark - quel est le moyen le plus facile de le faire?
Pourquoi ne pas utiliser la méthode toDF
? Vous devez seulement ajouter les noms de champs.
df = rdd.toDF(['column', 'value'])
La réponse de @dapangmao m'a amené à cette solution:
my_df = my_rdd.map(lambda l: Row(**dict(l))).toDF()
Consultez la documentation DataFrame pour que cet exemple fonctionne pour vous, mais cela devrait fonctionner. Je suppose que votre RDD s'appelle my_rdd
from pyspark.sql import SQLContext, Row
sqlContext = SQLContext(sc)
# You have a ton of columns and each one should be an argument to Row
# Use a dictionary comprehension to make this easier
def record_to_row(record):
schema = {'column{i:d}'.format(i = col_idx):record[col_idx] for col_idx in range(1,100+1)}
return Row(**schema)
row_rdd = my_rdd.map(lambda x: record_to_row(x))
# Now infer the schema and you have a DataFrame
schema_my_rdd = sqlContext.inferSchema(row_rdd)
# Now you have a DataFrame you can register as a table
schema_my_rdd.registerTempTable("my_table")
Je n'ai pas beaucoup travaillé avec DataFrames dans Spark mais cela devrait faire l'affaire
Dans pyspark, supposons que vous disposiez d'un cadre de données nommé userDF .
>>> type(userDF)
<class 'pyspark.sql.dataframe.DataFrame'>
Permet simplement de le convertir en RDD (
userRDD = userDF.rdd
>>> type(userRDD)
<class 'pyspark.rdd.RDD'>
et maintenant vous pouvez faire quelques manipulations et appeler par exemple la fonction map:
newRDD = userRDD.map(lambda x:{"food":x['favorite_food'], "name":x['name']})
Enfin, créons un DataFrame à partir d’un ensemble de données réparti résilient (RDD).
newDF = sqlContext.createDataFrame(newRDD, ["food", "name"])
>>> type(ffDF)
<class 'pyspark.sql.dataframe.DataFrame'>
C'est tout.
Je frappais ce message d'avertissement lorsque j'ai essayé d'appeler:
newDF = sc.parallelize(newRDD, ["food","name"] :
.../spark-2.0.0-bin-hadoop2.7/python/pyspark/sql/session.py:336: UserWarning: Using RDD of dict to inferSchema is deprecated. Use pyspark.sql.Row inst warnings.warn("Using RDD of dict to inferSchema is deprecated. "
Donc plus besoin de le faire ...