使用多个自联接重新格式化表时出现Pyspark stackoverflowError

时间:2018-12-19 15:14:40

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

我需要使用pyspark重新格式化表格。原始表格的格式如下,

+---+---------+-----+
| ID|attribute|value|
+---+---------+-----+
|  1|     name| luke|
|  1|      age|   24|
|  2|     name| mark|
|  2|      age|   22|
|  1|   salary|   70|
|  2|   salary|   69|
+---+---------+-----+

我想将其重新格式化为如下格式。

+---+-----+---+------+
| ID| name|age|salary|
+---+-----+---+------+
|  1| luke| 24|    70|
|  2| mark| 22|    69|
+---+-----+---+------+

每条记录具有大约1000个属性(名称,年龄等)。我尝试将自联接用于此任务,

# each record have ~1000 attributes    
attribs = ['name', 'age', 'salary', ...]
target_df = df.filter("attribute='%s'" %attribs[0])\
             .select('ID', 'value')\
             .withColumnRenamed('value', 'name')

for attr in attribs[1:]:
    target_df = target_df.join(
         df.filter("attribute='%s'" %attr)\
           .select('ID', 'value')\
           .withColumnRenamed('value', attr),
         on='ID', how='inner')
target_df.show()

不幸的是,我出现了stackoverflow(是的,错误)。我确信通过for循环的数据帧的行是固定的。当spark加入表时会发生什么?而且这种方法非常缓慢,有更好的方法吗?非常感谢!

0 个答案:

没有答案