scala - 如何在火花中加入多个数据框时应用Like操作?
问题描述
我正在尝试加入两个数据框,然后对其应用类似的操作。但它没有返回任何值。我想在这里进行模式匹配。任何建议我在这里做错了什么。
import org.apache.spark._
import org.apache.spark.sql.Row
val upcTable = spark.sqlContext.sparkContext.parallelize(Seq(
Row(1, 50, 100),
Row(2, 60, 200),
Row(36, 70, 300),
Row(45, 80, 400)
))
val lookupUpc = spark.sqlContext.sparkContext.parallelize(Seq(
Row(3, 70, 300),
Row(4, 80, 400)
))
val upcDf = spark.sqlContext.createDataFrame(upcTable, StructType(Seq(
StructField("U_ID", StringType, nullable = false),
StructField("V_ID", IntegerType, nullable = false),
StructField("R_ID", IntegerType, nullable = false))))
val lookupDf = spark.sqlContext.createDataFrame(lookupUpc, StructType(Seq(
StructField("U_ID", StringType, nullable = false),
StructField("V_ID", IntegerType, nullable = false))))
lookupDf.show()
val joinDf = upcDf.join(lookupDf,Seq("V_ID"),"inner").filter(upcDf("U_ID").like("%lookupDf(U_ID)")).select(upcDf("U_ID"),upcDf("V_ID"),upcDf("R_ID")).show()
在这里,我想要来自 upcDf 的 36 和 45。
解决方案
而不是 column 方法,比如which 需要一个 literal String
,方法contains,它接受一个类型的参数Any
(因此也是Column
)在你的情况下会更合适:
val joinDf = upcDf.join(lookupDf, Seq("V_ID"), "inner").
where(upcDf("U_ID").contains(lookupDf("U_ID"))).
select(upcDf("U_ID"), upcDf("V_ID"), upcDf("R_ID"))
joinDf.show
// +----+----+----+
// |U_ID|V_ID|R_ID|
// +----+----+----+
// | 45| 80| 400|
// | 36| 70| 300|
// +----+----+----+
请注意,U_ID
示例数据集中的列应该是String
基于列出的模式的类型。
[更新]
根据评论中明确的要求,如果您想将匹配限制为仅前导字符,我建议使用方法regexp_extract并将上述where
子句替换为以下内容:
where(lookupDf("U_ID") === regexp_extract(upcDf("U_ID"), "^(.)", 1))
推荐阅读
- assembly - 汇编 win64 api 堆栈保留大小额外 8 字节为什么
- amazon-web-services - 为什么 aws lambda 调用客户端错误地返回 ClientExecutionTimeoutException?
- javascript - 拆分和转置多列
- swift - 使用 Swift 在 Firestore 中发送表单数据
- git - 如何从上游更新 Github 项目
- r - Column by group 中的值之间的差异
- php - 对多维数组进行分组和求和
- javascript - 从数组中检索对象 WHERE 另一个对象匹配另一个数组
- flutter - 从外部打开我的颤振应用程序中的文件
- laravel - 为什么 Excel 中的文本字段在 Laravel 中导入为数字?