如何将一行返回到数据框中
How do you get a row back into a dataframe
这应该是一个简单的测试,将我的数据帧的第一行移动到一个新的数据帧中。
第一期 df.first() returns "row" 不是数据框。
下一个问题,当我尝试使用 spark.createDataFrame(df.first()) 时,它会告诉您它无法推断模式。
下一个问题spark.createDataFrame(df.first(), df.schema) 不行。
所以对于下面的原始架构:
root
|-- entity_name: string (nullable = true)
|-- field_name: array (nullable = true)
| |-- element: string (containsNull = true)
|-- data_row: array (nullable = true)
| |-- element: string (containsNull = true)
|-- data_schema: array (nullable = true)
| |-- element: string (containsNull = true)
我在代码中这样定义了模式:
xyz_schema = StructType([
StructField('entity_name',StringType(),True)
,StructField('field_name',ArrayType(StringType(),True),True)
,StructField('data_row',ArrayType(StringType(),True),True)
,StructField('data_schema',ArrayType(StringType(),True),True)
])
print(xyz.first())
xyz_1stRow = spark.createDataFrame(xyz.first(), xyz_schema)
以上都不行!我收到以下错误:
"TypeError: StructType can not accept object 'parquet/assignment/v1' in type <class 'str'>"
这就是印刷品向我展示的...
Row(entity_name='parquet/assignment/v1',
field_name=['Contract_ItemNumber', 'UPC', 'DC_ID', 'AssignDate',
'AssignID', 'AssignmentQuantity', 'ContractNumber', 'MaterialNumber',
'OrderReason', 'RequirementCategory', 'MSKU'], data_row=['\n
350,192660436296,2001,10/1/2019,84009248020191000,5,840092480,1862291010,711,V1\n\t\t\t\t\t',
'\n
180,191454773838,2001,10/1/2019,84009248020191000,6,840092480,1791301010,711,V1\n\t\t\t\t\t'],
data_schema=['StringType', 'StringType', 'StringType', None,
'StringType', 'IntegerType', 'StringType', 'StringType', 'StringType',
'StringType', 'StringType'])
我做错了什么?为什么字符串类型不接受字符串?
我在 pyspark(当前版本)中使用 Azure databricks。我更愿意继续使用 pyspark,而不是 R,而不是 Scala,并且不必转换为 pandas 并冒着我的数据在所有这些语言之间转换时被破坏的风险。
根据文档,createDataFrame 函数采用 RDD、list 或 pandas.DataFrame 并从中创建数据框。因此,您必须将 df.first
的结果放在括号中以使其成为列表。看看下面的例子:
df = spark.createDataFrame(
[('Galaxy', 2017, 27841, 17529),
('Galaxy', 2017, 29395, 11892),
('Novato', 2018, 35644, 22876),
('Novato', 2018, 8765, 54817)],
['model','year','price','mileage']
)
bla = spark.createDataFrame([df.first()])
bla.show()
输出:
+------+----+-----+-------+
| model|year|price|mileage|
+------+----+-----+-------+
|Galaxy|2017|27841| 17529|
+------+----+-----+-------+
这应该是一个简单的测试,将我的数据帧的第一行移动到一个新的数据帧中。
第一期 df.first() returns "row" 不是数据框。 下一个问题,当我尝试使用 spark.createDataFrame(df.first()) 时,它会告诉您它无法推断模式。
下一个问题spark.createDataFrame(df.first(), df.schema) 不行。
所以对于下面的原始架构:
root
|-- entity_name: string (nullable = true)
|-- field_name: array (nullable = true)
| |-- element: string (containsNull = true)
|-- data_row: array (nullable = true)
| |-- element: string (containsNull = true)
|-- data_schema: array (nullable = true)
| |-- element: string (containsNull = true)
我在代码中这样定义了模式:
xyz_schema = StructType([
StructField('entity_name',StringType(),True)
,StructField('field_name',ArrayType(StringType(),True),True)
,StructField('data_row',ArrayType(StringType(),True),True)
,StructField('data_schema',ArrayType(StringType(),True),True)
])
print(xyz.first())
xyz_1stRow = spark.createDataFrame(xyz.first(), xyz_schema)
以上都不行!我收到以下错误:
"TypeError: StructType can not accept object 'parquet/assignment/v1' in type <class 'str'>"
这就是印刷品向我展示的...
Row(entity_name='parquet/assignment/v1', field_name=['Contract_ItemNumber', 'UPC', 'DC_ID', 'AssignDate', 'AssignID', 'AssignmentQuantity', 'ContractNumber', 'MaterialNumber', 'OrderReason', 'RequirementCategory', 'MSKU'], data_row=['\n
350,192660436296,2001,10/1/2019,84009248020191000,5,840092480,1862291010,711,V1\n\t\t\t\t\t', '\n
180,191454773838,2001,10/1/2019,84009248020191000,6,840092480,1791301010,711,V1\n\t\t\t\t\t'], data_schema=['StringType', 'StringType', 'StringType', None, 'StringType', 'IntegerType', 'StringType', 'StringType', 'StringType', 'StringType', 'StringType'])
我做错了什么?为什么字符串类型不接受字符串?
我在 pyspark(当前版本)中使用 Azure databricks。我更愿意继续使用 pyspark,而不是 R,而不是 Scala,并且不必转换为 pandas 并冒着我的数据在所有这些语言之间转换时被破坏的风险。
根据文档,createDataFrame 函数采用 RDD、list 或 pandas.DataFrame 并从中创建数据框。因此,您必须将 df.first
的结果放在括号中以使其成为列表。看看下面的例子:
df = spark.createDataFrame(
[('Galaxy', 2017, 27841, 17529),
('Galaxy', 2017, 29395, 11892),
('Novato', 2018, 35644, 22876),
('Novato', 2018, 8765, 54817)],
['model','year','price','mileage']
)
bla = spark.createDataFrame([df.first()])
bla.show()
输出:
+------+----+-----+-------+
| model|year|price|mileage|
+------+----+-----+-------+
|Galaxy|2017|27841| 17529|
+------+----+-----+-------+