当我开始学习PySpark的时候,我使用列表来创建dataframe
。现在从列表中推断模式已经被弃用了,我得到了一个警告,它建议我使用pyspark.sql.Row
。然而,当我尝试使用Row
创建一个时,我遇到了推断模式问题。这是我的代码:
>>> row = Row(name='Severin', age=33)
>>> df = spark.createDataFrame(row)
这将导致以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/spark2-client/python/pyspark/sql/session.py", line 526, in createDataFrame
rdd, schema = self._createFromLocal(map(prepare, data), schema)
File "/spark2-client/python/pyspark/sql/session.py", line 390, in _createFromLocal
struct = self._inferSchemaFromList(data)
File "/spark2-client/python/pyspark/sql/session.py", line 322, in _inferSchemaFromList
schema = reduce(_merge_type, map(_infer_schema, data))
File "/spark2-client/python/pyspark/sql/types.py", line 992, in _infer_schema
raise TypeError("Can not infer schema for type: %s" % type(row))
TypeError: Can not infer schema for type: <type 'int'>
所以我创建了一个模式
>>> schema = StructType([StructField('name', StringType()),
... StructField('age',IntegerType())])
>>> df = spark.createDataFrame(row, schema)
但随后会抛出这个错误。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/spark2-client/python/pyspark/sql/session.py", line 526, in createDataFrame
rdd, schema = self._createFromLocal(map(prepare, data), schema)
File "/spark2-client/python/pyspark/sql/session.py", line 387, in _createFromLocal
data = list(data)
File "/spark2-client/python/pyspark/sql/session.py", line 509, in prepare
verify_func(obj, schema)
File "/spark2-client/python/pyspark/sql/types.py", line 1366, in _verify_type
raise TypeError("StructType can not accept object %r in type %s" % (obj, type(obj)))
TypeError: StructType can not accept object 33 in type <type 'int'>
4条答案
按热度按时间hs1ihplo1#
createDataFrame
函数接受一个行列表(以及其他选项)加上模式,因此正确的代码如下所示:输出:
在pyspark文档(link)中,您可以找到有关createDataFrame函数的更多详细信息。
to94eoyn2#
你需要创建一个Row类型的列表,并把这个列表和schema一起传递给你的
createDataFrame()
方法。oo7oh9g93#
如果你只是制作一个panda Dataframe ,你可以将每行转换成一个dict,然后依赖panda的类型推断,如果这对你的需求足够好的话。
sq1bmfud4#
我最近也遇到过类似的问题,这里的答案帮助我更好地理解这个问题。
我的代码:
导致了一个非常相似的错误
问题的原因:
createDataFrame需要一个行数组。因此,如果您只有一行,并且不想创建更多行,只需将其设置为数组即可:[行]