![](/img/trans.png)
[英]How to perform column level validation by joining one Big data frame to many small data frame in spark
[英]How to Apply Like operation while joining multiple data frame in spark?
我試圖加入兩個數據框,然后對其應用類似的操作。 但是它沒有返回任何值。 我想在這里進行模式匹配。 任何建議我在這里做錯了。
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。
而不是像期望一個文字String
那樣的列方法,而包含一個采用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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.