如何正确循环和构建pyspark数据框

时间:2019-07-03 06:24:23

标签: python apache-spark dataframe pyspark iteration

我已经完成了Pyspark数据框的逻辑,现在必须应用不同的输入并合并结果。

我想知道创建UDF并多次调用它是否对性能有好处,而不是像下面那样循环遍历这些值。

### res_schema definition ###

twr = []
twr.append((330,900,900,18900,1))
twr.append((480,900,1800,27000,2))
twr.append((660,900,3600,36000,4))
twr.append((1440,0,25200,43200,1))
twr.append((10080,0,86400,259200,1))

results = []

for tup in twr:
    I = tup[0]
    R = tup[1]
    SR = tup[2]
    SW = tup[3]
    NR = tup[4]

    res = spark.sql(
        """
        SELECT *, LAST_VALUE(offdate) OVER (
            PARTITION BY name
            ORDER BY CAST(ondate AS timestamp) 
            RANGE BETWEEN CURRENT ROW AND INTERVAL {0} MINUTES FOLLOWING
        ) AS ld, SUM(works) OVER (
            PARTITION BY name
            ORDER BY CAST(ondate AS timestamp) 
            RANGE BETWEEN CURRENT ROW AND INTERVAL {0} MINUTES FOLLOWING
        ) AS ws
         FROM lc
         """.format(I))

    for r in res:
        results.append(r)

    ### More logic ###

resdf = spark.createDataFrame(results, res_schema)

我的附加逻辑是广泛的,但仍然完全是sql火花,因此我不确定运行缓慢是由于查询还是for循环引起的。

2 个答案:

答案 0 :(得分:0)

我认为将DF转换为List然后再次将其转换为DF是不理想的。当将DF转换为List时,您将利用pyspark的优势,例如处理大量数据和并行性。

您应该尝试根据DF上的map,filter,reduce函数建模逻辑,而不是用于创建列表并在列表上应用逻辑。

答案 1 :(得分:0)

最好避免UDF 以获得更好的性能,尤其是在Pyspark中,因为它将生成单独的python进程。

接下来,如果要从行“ r”获取列值,则可以尝试使用内置的 collect_list collect_set 函数。