如何读取 csv 文件并将值分配给 spark scala 中的变量

Posted

技术标签:

【中文标题】如何读取 csv 文件并将值分配给 spark scala 中的变量【英文标题】:How to read a csv file and assign values to the variable in spark scala 【发布时间】:2021-02-17 17:35:09 【问题描述】:

我正在努力实现以下目标。 我有包含以下内容的 csv 文件

Sno,ColumnName,ColumnValue
——————————-———————————
1,svEmp,(Case when col1 = 1 then 2 else 1 end)
2,svCol,(Case when col2 = 2 then 3 else 6 end)

我有一个要求,我需要在 spark scala 中读取 csv 文件并将columnValue 分配给ColumnName(创建稍后可以在 spark.sql 语句中使用的暂存变量),如下所示

val svEmp = "(Case when col1 = 1 then 2 else 1 end)"
//and so on

spark.sql("select $svEmp as CalCol from tableName")

这是如何实现的? 任何帮助将不胜感激。

【问题讨论】:

你愿意分享你的代码吗? 【参考方案1】:

您可以将包含 select 表达式的 CSV 读取到数据框中,然后聚合以连接列 ColumnValueColumnName,最后将生成的 select 语句收集到字符串变量中:

val df = spark.read.option("header", "true").csv(path)

val selectStm = df.agg(
    concat_ws(
      ", ",
      collect_list(concat(col("ColumnValue"), lit(" as "), col("ColumnName")))
    )
  ).first.getString(0)

//selectStm: String = (Case when col1 = 1 then 2 else 1 end) as svEmp, (Case when col2 = 2 then 3 else 6 end) as svCol

val sqlQuery = s"select $selectStm from tableName"
//sqlQuery: String = select (Case when col1 = 1 then 2 else 1 end) as svEmp, (Case when col2 = 2 then 3 else 6 end) as svCol from tableName

val df2 = spark.sql(sqlQuery)

【讨论】:

谢谢黑主教!!当我们选择变量而不对它们执行任何转换时,下面的解决方案会有所帮助。如果我们有一个语句作为 spark.sql("select $svEmp+4 as col1, col3, $svCol+$svEmp as CalCol from tableName")

以上是关于如何读取 csv 文件并将值分配给 spark scala 中的变量的主要内容,如果未能解决你的问题,请参考以下文章

如何将每个 .csv 文件分配给单个子图?

如何一次读取一个字符的字符串或文件并将该字符的 ASCII 值分配给 CMD 批处理中的变量? [复制]

如何读取 2 列 csv 文件并将列绘制为 x 与 y 值

Apache Spark - 将 UDF 的结果分配给多个数据框列

读取 zip 中的所有 csv 文件,并将相应的 csv 文件名作为数据帧变量名

如何逐个读取csv文件数据并将其放入变量Using Groovy