Le cas est très simple, je dois convertir une liste python en trame de données avec le code suivant
from pyspark.sql.types import StructType
from pyspark.sql.types import StructField
from pyspark.sql.types import StringType, IntegerType
schema = StructType([StructField("value", IntegerType(), True)])
my_list = [1, 2, 3, 4]
rdd = sc.parallelize(my_list)
df = sqlContext.createDataFrame(rdd, schema)
df.show()
il a échoué avec l'erreur suivante:
raise TypeError("StructType can not accept object %r in type %s" % (obj, type(obj)))
TypeError: StructType can not accept object 1 in type <class 'int'>
Cette solution est également une approche qui utilise moins de code, évite la sérialisation vers RDD et est probablement plus facile à comprendre:
from pyspark.sql.types import IntegerType
# notice the variable name (more below)
mylist = [1, 2, 3, 4]
# notice the parens after the type name
spark.createDataFrame(mylist, IntegerType()).show()
REMARQUE: Pour nommer votre variable list
: le terme list
est une fonction intégrée Python). Il est donc vivement recommandé d'éviter d'utiliser les noms intégrés le nom/libellé de nos variables parce que nous finissons par écraser des éléments tels que la fonction list()
. Lors du prototypage de quelque chose de rapide et de sale, un certain nombre de personnes utilisent quelque chose comme: mylist
.
S'il vous plaît voir le code ci-dessous:
from pyspark.sql import Row
li=[1,2,3,4]
rdd1 = sc.parallelize(li)
row_rdd = rdd1.map(lambda x: Row(x))
df=sqlContext.createDataFrame(row_rdd,['numbers']).show()
df
+-------+
|numbers|
+-------+
| 1|
| 2|
| 3|
| 4|
+-------+