使用apache箭头分组数据框数据

时间:2019-02-20 09:00:33

标签: python pyspark apache-arrow

schema = StructType([
    StructField("title", StringType(), False),
    StructField("stringdataA", StringType(), False),
#     StructField("list", ArrayType( StructType([
#         StructField("A", IntegerType()  , False),
#         StructField("B", StringType()   , False),
#         StructField("C", TimestampType(), False)
#     ]))),
    StructField("stringdataB",  StringType(), False)])

    @pandas_udf(schema, PandasUDFType.GROUPED_MAP)
    def make_data(x):
        ~~ make data fitted in shcema

groupedList = df.groupby("groupkey").apply(make_data)

'make_data'函数将生成适合我定义的模式的数据,但是当我在模式中添加list(map())结构字段时。它给了我一个错误,如下所示。真的不支持该架构吗?

有什么方法可以获取我可以处理的list(map())结构数据吗?

  

NotImplementedError:带有分组地图熊猫UDF的returnType无效:   StructType(List(StructField(title,StringType,false),StructField(stringdataA,StringType,false),StructField(list,ArrayType(StructType(List(StructField(A,IntegerType,false),StructField(B,StringType,false),) StructField(C,TimestampType,false))),true),true),StructField(stringdataB,StringType,false)))   不支持

2 个答案:

答案 0 :(得分:0)

我认为您的列表元素是StructType,不受支持:

https://github.com/apache/spark/blob/4a4e7aeca79738d5788628d67d97d704f067e8d7/python/pyspark/sql/types.py#L1581

如果要确认,请尝试致电pyspark.sql.types.to_arrow_schema(schema),看看会发生什么。

答案 1 :(得分:0)

由于不支持StructType,一种解决方法是在返回数据之前使用json.dumps(data)转储数据。此模式将具有StringType()字段。

稍后,您可以使用json.loads()转换为Array / list