【问题标题】:Read Rules from a file and apply those rules to pyspark dataframe rows从文件中读取规则并将这些规则应用于 pyspark 数据框行
【发布时间】:2019-09-25 14:00:05
【问题描述】:

我有一个规则手册 csv,数据如下所示:

operator|lastname|operator|firstname|val

equals    | ABC    |contains| XYZ     | 2

equals  | QWE    |contains| rty     | 3

所以如果 lastname 等于 ABC 和 firstname 像 XYZ 那么 val 将是 2 ,就像那样。此文件可以更改或修改,因此条件将是动态的。将来甚至可以添加行。

现在,我的 pyspark 数据框是:

lastname| firstname| service

ABC     | XYZNMO   | something

QUE     | rtysdf   | something

我需要将该 csv 文件中的规则应用于此数据框并添加 val 列。所以我想要的输出数据框将是:

lastname| firstname| service  | val

ABC     | XYZNMO   | something| 2

QUE     | rtysdf   | something| 3

请记住,规则手册是动态的,可以随时添加、删除或修改规则。甚至可以修改规则手册中的运算符。 提前致谢

【问题讨论】:

  • 嗨,有什么理由将规则保存到 df 中?例如,是否有任何动态机制生成这些规则?或者您也可以将它们存储到一个文件中?

标签: pyspark apache-spark-sql pyspark-sql aws-glue pyspark-dataframes


【解决方案1】:

使用 csv parser 解析 csv 文件并获取规则数据。然后以编程方式,使用规则数据创建 SQL 语句 - 类似于:

query = "SELECT
        CASE WHEN lastname = 'ABC' and firstname LIKE 'XYZ%' THEN 2
             ELSE
                 CASE WHEN lastname = 'QUE' and firstname LIKE 'rty% THEN 3
             END
        END AS val
    FROM table"

然后运行:

df.createOrReplaceTempView("table")
result_df = spark.sql(query) # above dynamic query

【讨论】:

    【解决方案2】:

    我相信您可以使用以下过程来实现它

    1. 在数据框之上创建临时表
    2. 使用 Spark SQL api 编写 SQL 并将其作为单个记录保存在文本文件中
    3. 使用读取 sql 语句 sqlStatement=spark.sparkContext.textFile("sqllocation").first().toString() 您在步骤#2 中准备并使用 spark.sql(sqlStatement) 运行它

    这样您可以根据需要更新文本文件中的 sql 语句

    【讨论】:

      猜你喜欢
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 2016-02-28
      • 1970-01-01
      • 2023-03-29
      • 2023-03-11
      • 2014-12-07
      相关资源
      最近更新 更多