Spark/Scala:如何在DataFrame操作的条件表达式中使用字符串变量
在Spark/Scala的DataFrame条件表达式中使用字符串变量
我来给你演示如何在Spark DataFrame的条件操作里使用字符串变量,结合你提供的示例DataFrame来具体说明。
首先,先创建你提到的示例DataFrame:
val df = Seq( (1, "CS", 0, Array(0.1, 0.2, 0.4, 0.5)), (4, "Ed", 0, Array(0.4, 0.8, 0.3, 0.6)), (7, "CS", 0, Array(0.2, 0.5, 0.4, 0.7)), (101, "CS", 1, Array(0.5, 0.7, 0.3, 0.8)), (5, "CS", 1, Array(0.4, 0.2, 0.6, 0.9)) ).toDF("id", "dept", "test", "array") df.show()
执行后输出:
+---+----+----+--------------------+ | id|dept|test| array| +---+----+----+--------------------+ | 1| CS| 0|[0.1, 0.2, 0.4, 0.5]| | 4| Ed| 0|[0.4, 0.8, 0.3, 0.6]| | 7| CS| 0|[0.2, 0.5, 0.4, 0.7]| |101| CS| 1|[0.5, 0.7, 0.3, 0.8]| | 5| CS| 1|[0.4, 0.2, 0.6, 0.9]| +---+----+----+--------------------+
接下来分两种常见场景演示如何使用字符串变量:
场景1:字符串变量作为条件匹配值
比如我们想要过滤dept列等于某个动态字符串的行,先定义字符串变量:
val targetDept = "CS"
然后在filter操作中直接使用这个变量即可:
val filteredDF = df.filter(col("dept") === targetDept) filteredDF.show()
输出结果会只保留dept为CS的行:
+---+----+----+--------------------+ | id|dept|test| array| +---+----+----+--------------------+ | 1| CS| 0|[0.1, 0.2, 0.4, 0.5]| | 7| CS| 0|[0.2, 0.5, 0.4, 0.7]| |101| CS| 1|[0.5, 0.7, 0.3, 0.8]| | 5| CS| 1|[0.4, 0.2, 0.6, 0.9]| +---+----+----+--------------------+
如果是when表达式里使用变量也是同样的逻辑,比如给匹配目标部门的行打标记:
val markedDF = df.withColumn("is_target_dept", when(col("dept") === targetDept, 1).otherwise(0)) markedDF.show()
场景2:字符串变量作为列名
如果你的字符串变量存储的是列名,比如我们要基于动态列名进行条件过滤,需要先用col()方法把字符串变量转换成Column对象:
val conditionCol = "test" val targetValue = 1 val filteredByColVarDF = df.filter(col(conditionCol) === targetValue) filteredByColVarDF.show()
输出结果会保留test列等于1的行:
+---+----+----+--------------------+ | id|dept|test| array| +---+----+----+--------------------+ |101| CS| 1|[0.5, 0.7, 0.3, 0.8]| | 5| CS| 1|[0.4, 0.2, 0.6, 0.9]| +---+----+----+--------------------+
也可以使用expr()方法拼接字符串表达式,比如:
val filterExpr = s"$conditionCol = $targetValue" val filteredByExprDF = df.filter(expr(filterExpr)) filteredByExprDF.show()
这种方式适合更复杂的动态表达式拼接,但要注意SQL注入风险(如果变量来自不可信源的话)。
内容的提问来源于stack exchange,提问作者Guanghua Shu
相关产品推荐
相关产品推荐

