Ich versuche, die Spark-RDD in einen DataFrame umzuwandeln. Ich habe die Dokumentation und das Beispiel gesehen, in dem das Schema an die Funktion ____sqlContext.CreateDataFrame(rdd,schema)
übergeben wird.
Ich habe aber 38 Spalten oder Felder, und dies wird noch weiter zunehmen. Wenn ich das Schema manuell mit Angabe der Feldinformationen gebe, wird dies eine so langweilige Aufgabe.
Gibt es eine andere Möglichkeit, das Schema anzugeben, ohne die Informationen der Spalten vorher zu kennen.
Sehen,
Es gibt zwei Möglichkeiten, eine RDD in DF in Spark umzuwandeln.
toDF()
und createDataFrame(rdd, schema)
Ich zeige Ihnen, wie Sie das dynamisch tun können.
Mit dem Befehl toDF()
können Sie einen RDD[Row]
in einen Dataframe konvertieren. Der Punkt ist, dass das Objekt Row()
ein **kwargs
-Argument erhalten kann. Es gibt also einen einfachen Weg, dies zu tun.
from pyspark.sql.types import Row
#here you are going to create a function
def f(x):
d = {}
for i in range(len(x)):
d[str(i)] = x[i]
return d
#Now populate that
df = rdd.map(lambda x: Row(**f(x))).toDF()
Auf diese Weise können Sie einen Datenrahmen dynamisch erstellen.
Eine andere Möglichkeit besteht darin, ein dynamisches Schema zu erstellen. Wie?
Diesen Weg:
from pyspark.sql.types import StructType
from pyspark.sql.types import StructField
from pyspark.sql.types import StringType
schema = StructType([StructField(str(i), StringType(), True) for i in range(32)])
df = sqlContext.createDataFrame(rdd, schema)
Dieser zweite Weg ist sauberer, um das zu tun ...
So können Sie Dataframes dynamisch erstellen.
Versuchen Sie, ob das funktioniert
sc = spark.sparkContext
# Infer the schema, and register the DataFrame as a table.
schemaPeople = spark.createDataFrame(RddName)
schemaPeople.createOrReplaceTempView("RddName")