Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在spark中连接多个数据帧时应用Like操作?_Scala_Apache Spark - Fatal编程技术网

Scala 如何在spark中连接多个数据帧时应用Like操作?

Scala 如何在spark中连接多个数据帧时应用Like操作?,scala,apache-spark,Scala,Apache 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,

我试图连接两个数据帧,然后对其应用一个类似的操作。但它没有返回任何值。我想在这里做一个模式匹配。任何关于我做错了什么的建议

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方法,它需要一个literal
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\U ID
应为
String
类型

[更新]

根据评论中明确的要求,如果您想将匹配仅限于主角,我建议使用方法,并将上述
where
条款替换为以下内容:

where(lookupDf("U_ID") === regexp_extract(upcDf("U_ID"), "^(.)", 1))
与需要文本
字符串
的列方法不同,采用类型为
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\U ID
应为
String
类型

[更新]

根据评论中明确的要求,如果您想将匹配仅限于主角,我建议使用方法,并将上述
where
条款替换为以下内容:

where(lookupDf("U_ID") === regexp_extract(upcDf("U_ID"), "^(.)", 1))

谢谢但我只想匹配第一个位置,而不是字符串中的任何位置..就像模式一样matching@Pradeep,请看我的扩展答案。谢谢。但我只想匹配第一个位置,而不是字符串中的任何位置..就像模式一样matching@Pradeep,请参阅我的扩展答案。