Python Spark组将事务转换为嵌套模式

时间:2016-05-14 09:39:59

标签: pyspark spark-dataframe pyspark-sql

我想将pyspark.sql.dataframe.DataFrameddf”中存储的交易分组为“key”,表示交易来源(在本例中为客户ID)。

分组是一个非常昂贵的过程,所以我想在嵌套模式中将组写入磁盘:

(key, [[c1, c2, c3,...], ...])

这将允许我快速加载密钥上的所有事务,并开发复杂的自定义聚合器而无需重新运行分组。

如何创建嵌套架构并将其写入磁盘?

1 个答案:

答案 0 :(得分:0)

我花了很长时间来弄明白这一点,虽然答案很简单,所以我想我会在这里发布我的解决方案。

首先按key(客户ID)减少所有交易:

from operators import add
# ddf is a dataframe with a transaction in each row.  Key is the column
# we want to group the transactions by.

txnrdd = ddf.rdd.map(lambda row: (row['key'], [row],) ).reduceByKey(add)

这会使rdd看起来像(key, [list of Rows])。要将其写回dataframe,您需要构建架构。交易清单可以通过ArrayType建模。

from pyspark.sql import types as sqxt
txn_schema = sqxt.StructType([
    sqxt.StructField('Key', sqxt.StringType()),
    sqxt.StructField('Transactions', sqxt.ArrayType(ddf.schema))
])

然后在这种结构中将数据写入磁盘很简单:

txnddf = txnrdd.toDF(schema=txn_schema)
txnddf.write.parquet('customer-transactions.parquet')

性能似乎没问题。无法通过RDD找不到办法。