2016-02-12 41 views
4

我有一个数据框(或可以是任何RDD)包含一个众所周知的模式类似这样的几百万行:在pyspark中积累数据框的最有效方法是什么?

Key | FeatureA | FeatureB 
-------------------------- 
U1 |  0 |   1 
U2 |  1 |   1 

我需要从一个包含相同的不同功能的磁盘加载其他十几集密钥数量。一些数据集的宽度可达十几列。试想一下:

Key | FeatureC | FeatureD | FeatureE 
------------------------------------- 
U1 |  0 |  0 |   1 

Key | FeatureF 
-------------- 
U2 |  1 

感觉就像一个折叠或聚集在这里我只想遍历所有的数据集,并取回这样的事情:

Key | FeatureA | FeatureB | FeatureC | FeatureD | FeatureE | FeatureF 
--------------------------------------------------------------------- 
U1 |  0 |  1 |  0 |  0 |  1 |  0 
U2 |  1 |  1 |  0 |  0 |  0 |  1 

我试着加载每个数据帧,然后加入,但一旦我过去了一些数据集,这将永远消失。我错过了完成这项任务的常见模式或有效途径吗?

+0

由于一些背景资料,我试着用钥匙希望利用一些分割的订购dataframes,但还没有看到在执行时间的大变化。 –

+0

我也使用了像字符串一样的数据处理方式,并通过键值和连接值来实现,这些值实际上工作得很好。 –

+0

@ zero323 AFAIK有没有办法从据称是在逻辑计划中使用(我也尝试)的排序依据明确地划分一个数据帧,备用。如果我将它转换为RDD,那么我可能会聚合Bkey? –

回答

1

假设有每个键最多一个行中的每个DataFrame和所有按键都基本类型,你可以尝试的联合与聚集。让我们开始与一些进口和示例数据:

from itertools import chain 
from functools import reduce 
from pyspark.sql.types import StructType 
from pyspark.sql.functions import col, lit, max 
from pyspark.sql import DataFrame 

df1 = sc.parallelize([ 
    ("U1", 0, 1), ("U2", 1, 1) 
]).toDF(["Key", "FeatureA", "FeatureB"]) 

df2 = sc.parallelize([ 
    ("U1", 0, 0, 1) 
]).toDF(["Key", "FeatureC", "FeatureD", "FeatureE"]) 

df3 = sc.parallelize([("U2", 1)]).toDF(["Key", "FeatureF"]) 

dfs = [df1, df2, df3] 

接下来我们可以提取公共架构:

output_schema = StructType(
    [df1.schema.fields[0]] + list(chain(*[df.schema.fields[1:] for df in dfs])) 
) 

,改造所有DataFrames

transformed_dfs = [df.select(*[ 
    lit(None).cast(c.dataType).alias(c.name) if c.name not in df.columns 
    else col(c.name) 
    for c in output_schema.fields 
]) for df in dfs] 

最后一个联盟和虚拟聚合:

combined = reduce(DataFrame.unionAll, transformed_dfs) 
exprs = [max(c).alias(c) for c in combined.columns[1:]] 
result = combined.repartition(col("Key")).groupBy(col("Key")).agg(*exprs) 

如果每个键有多个行,但单独的列依然原子,你可以尝试用collect_list/collect_set随后explode更换max

+0

壮观。现在就开始研究这种方法,并且今天将回答问题/评论/发信人。 –

相关问题