繁体   English   中英

如何将同一张表的多个 pyspark sql 查询合并为一个查询

[英]How to combine multiple pyspark sql queries to the same table into one query

我目前对一个问题有一个不好的解决方案,但它确实有效。 我想就如何改进我现有的解决方案提出建议。 我有一个火花 dataframe ,其中包含来自许多不同机器的传感器数据,格式为长格式。 这是一个例子:

machine | run | timestep            | sensor1 | sensor2 |
A       |  1  | 2020-10-11 00:00:10 | 10      | 200     |
A       |  1  | 2020-10-11 00:00:20 | 11      | 200     |
A       |  1  | 2020-10-11 00:00:30 | 1       | 200     |
B       |  1  | 2020-10-11 01:10:10 | 10      | 10      |
B       |  1  | 2020-10-11 01:10:20 | 1000    | 5       |
A       |  1  | 2020-10-11 00:00:40 | 10      | 200     |
A       |  2  | 2020-20-11 00:00:10 | 10      | 200     |
...

我在代码中有一个机器(键)字典,其中包含相关时间范围(值)的列表。 我想仅在提供的时间范围内提取每台指定机器的所有信息。 例如

{"A": [("2020-10-1 00:00:00", "2020-12-30"), ("2021-1-15", "2021-3-30"))], ...}

是字典中的示例条目。 因此,在这种情况下,我想为一台设备在给定时间范围内提取两组数据。 我目前遍历字典并在字典中给定的每个时间范围运行一个查询,每个结果都保存到一个文件中。 然后我遍历保存的文件,并将所有单独的数据帧组合成一个 dataframe。

这是在代码中进行的过程的示例

    for machine, machine_parts in lifetimes.items():
        for machine_part in machine_parts:
            query = f"""
            select `timestamp`, sensor1, run, machine
            from database.table
            where machine = '{machine}'
            and start >= '{machine_part.install}'
            and end <= '{machine_part.removal}'
            order by start, `timestamp` asc
            """

            print(f"Executing query: {query}")
            spark = get_spark_context()
            df = spark.sql(query).toPandas()

            filename = f"{machine}_{machine_part.install}_{machine_part.removal}.csv".replace(
                " ", "_"
            )

            MACHINE_PART_LIFETIME_DIR.mkdir(parents=True, exist_ok=True)

            filepath = os.path.join(HEATER_LIFETIME_DIR, filename)
            print(f"Saving to: {filepath}")
            df.to_csv(filepath, index=False)
            print("-" * 20)

理想情况下,我认为应该有可能(并且可能更好)有一个查询能够在一个 go 中完成所有这些操作,而不是运行多个查询,保存 output,重新打开,组合成一个 Z6A8064B53DF47945505700,然后保存 C 结果. 这应该使我不必将每个火花 dataframe 转换为 pandas 一个,保存到磁盘然后重新打开每个火花并合并为一个。 有没有办法用 pyspark 动态地做到这一点?

因此,正如@mck 建议的那样,我可以通过使用连接来大幅改善这一点。 对于那些感兴趣的人,我使用了下面的相关代码。

从字典到 go 到火花 dataframe:

values = []
for machine, machine_parts in lifetimes.items():
    for machine_part in machine_parts:
        values.append((machine, machine_part.install, machine_part.removal))
columns = ["machine", "install_date", "removal_date"]
df = spark.createDataFrame(values, columns)

加入:

df_joined = df1.join(df).where((df1.machine == df.machine) & (df1.start >= df.install_date) & (df1.end<= df.removal_date))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM