【问题标题】:Use a list to define SELECT columns in a query使用列表定义查询中的 SELECT 列
【发布时间】:2018-05-04 03:29:57
【问题描述】:

我需要从列名完全不一致的 parquet 文件中进行查询。为了解决这个问题并确保我的模型得到它期望的数据,我需要“预取”列列表,然后应用一些正则表达式模式来限定我需要检索的列。在伪代码中:

PrefetchList = sqlContext.read.parquet(my_parquet_file).schema.fields
# Insert variable statements to check/qualify the columns against rules here
dfQualified = SELECT [PrefetchList] from parquet;

我已经四处寻找,看看这是否可以实现,但没有任何成功。如果这在语法上是正确的(或关闭),或者如果有人有其他建议,我愿意接受。

谢谢

【问题讨论】:

  • 我看到标签 pyspark 我假设你正在使用 Python 购买 如果你使用 scala 没问题,案例类可以有效地解决你的问题。

标签: apache-spark pyspark pyspark-sql


【解决方案1】:

您可以使用schema 方法,也可以使用.columns 方法。 请注意,spark 中的 select 方法有点奇怪,它被定义为 def select(col: String, cols: String*) 所以你不能传回它 select(fields:_*),你必须使用 df.select(fields.head, fields.tail:_*) 这有点难看,但幸运的是selectExpr(exprs: String*) 作为替代方案。所以下面这将起作用。它只需要以“用户”开头的列

fields = df.columns.filter(_.matches("^user.+")) // BYO regexp
df.selectExpr(fields:_*)

这当然假设df 包含您的数据框,并加载有sqlContext.read.parquet()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多