-1

我有一个规则书 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

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

4

2 回答 2

0

使用 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
于 2019-09-25T14:39:56.797 回答
0

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

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

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

于 2019-09-25T14:41:03.177 回答