【问题标题】:Iterating a select query迭代选择查询
【发布时间】:2019-12-10 18:59:44
【问题描述】:

我想创建一个数据集,它是许多选择查询的堆叠数据集,其中一个参数在我的 where 子句中更改。我可以通过调用选择查询 n 次并相应地更改我的 where 原因来使用 python 来做到这一点。这是我可以在 SQL 中一次性完成的事情,而无需进行 n 个单独的选择查询吗?

例如

dfs = []
for name in names:
    dfs.append(spark.select("select * from personal_data where Name = 'f{name}'"))
# Some logic to take the list of dataframes and make one stacked dataframe

是否可以通过一个选择查询而不是连续查询来实现这一点?

目前采用上述方法的原因是因为表中的行没有组合在一起,例如,当我输入第一个名称的 where 子句时,我得到第 1、6、10 行。下一个名称将返回行2、3、7。

生成的数据集应保留此顺序,即

第 1、6、10、2、3、7 行。这至少是我进行许多选择查询然后将结果数据帧堆叠在一起的原因。

【问题讨论】:

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


    【解决方案1】:

    您不需要为此创建多个 DataFrame。只需在names 列表中选择带有Name 的行。

    如果名称列表不是太大,那么您可以使用isin 函数和filter

    df.filter(col("Name").isin(*names)).show()
    

    否则,请按照@Oliver W 的建议使用join

    【讨论】:

    • 这是否可能会乱序返回行?或者与名称谓词有关的所有行会一起出现,然后是下一批?
    • 我不确定我是否理解您的问题,但这实际上会返回满足Name 的所有行在names 列表中。相当于 SQL 语法WHERE Name IN ('name1', 'name2', ....)
    • 我在我的问题中添加了更多细节,如果这样更清楚,请告诉我。
    • 好的,只需添加一个 orderBy Name,您就可以将每个 Name 的行放在一起。 (df.filter(col("Name").isin(*names)).orderBy(col("Name")).show())
    【解决方案2】:

    使用 SQL 连接:

    names_df = spark.createDataFrame([(n,) for n in names],
                                     schema=("name",))
    names_df.registerTempTable("names_df")
    spark.sql("select * from personal_data as p left join names_df as n where n.name = p.Name").show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 2018-09-23
      • 2015-09-30
      • 2016-10-11
      • 1970-01-01
      相关资源
      最近更新 更多