如何取消堆栈数据集(使用数据透视)?

时间:2016-02-16 08:50:29

标签: apache-spark apache-spark-sql pyspark-sql

我尝试了新的" pivot" larger stacked dataset上的1.6函数。它有5,656,458行,IndicatorCode列有1344个不同的代码。

我的想法是使用数据转移到"取消堆栈" (在pandas术语中)这个数据集并且每个IndicatorCode都有一列。

schema = StructType([ \
   StructField("CountryName", StringType(), True), \
   StructField("CountryCode", StringType(), True), \
   StructField("IndicatorName", StringType(), True), \
   StructField("IndicatorCode", StringType(), True), \
   StructField("Year", IntegerType(), True), \
   StructField("Value", DoubleType(), True)  \
])

data = sqlContext.read.load('hdfs://localhost:9000/tmp/world-development-indicators/Indicators.csv', 
                            format='com.databricks.spark.csv', 
                            header='true', 
                            schema=schema)

data2 = indicators_csv.withColumn("IndicatorCode2", regexp_replace("indicatorCode", "\.", "_"))\
                      .select(["CountryCode", "IndicatorCode2", "Year", "Value"])

columns = [row.IndicatorCode2 for row in data2.select("IndicatorCode2").distinct().collect()]

data3 = data2.groupBy(["Year", "CountryCode"])\
             .pivot("IndicatorCode2", columns)\
             .max("Value")

成功返回后,data3.first()从未返回结果(我在10分钟后使用3个核心在我的独立中断)。

我使用RDDaggregateByKey的方法运行良好,因此我没有搜索有关如何执行此操作的解决方案,但是使用DataFrames的数据透视是否也能解决问题。

2 个答案:

答案 0 :(得分:3)

嗯,一般来说,旋转不是一种非常有效的操作,使用DataFrame API可以做很多事情。您可以尝试的一件事是repartition您的数据:

(data2
  .repartition("Year", "CountryCode")
  .groupBy("Year", "CountryCode")
  .pivot("IndicatorCode2", columns)
  .max("Value"))

甚至聚合:

from pyspark.sql.functions import max

(df
    .groupBy("Year", "CountryCode", "IndicatorCode")
    .agg(max("Value").alias("Value"))
    .groupBy("Year", "CountryCode")
    .pivot("IndicatorCode", columns)
    .max("Value"))

在应用pivot之前。两种解决方案背后的想法是一样的。而不是移动大的扩展Rows移动狭窄的密集数据并在本地扩展。

答案 1 :(得分:1)

Spark 2.0引入了SPARK-13749一个pivot的实现,对于大量的pivot列值更快。

在我的计算机上使用Spark 2.1.0进行测试,您的示例现在可以在48秒内运行。