Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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中应用条件_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 从表中读取值并在Spark中应用条件

Scala 从表中读取值并在Spark中应用条件,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有数据帧:df1 +------+--------+--------+--------+ |名称|值1 |值2 |值3| +------+--------+--------+--------+ |A | 100 |零| 200| |B | 10000 | 300 | 10| |c |空| 10 | 100| +------+--------+--------+--------+ 第二个数据帧:df2: +------+------+ |Col1 | col2| +------+------+

我有数据帧:df1

+------+--------+--------+--------+
|名称|值1 |值2 |值3|
+------+--------+--------+--------+
|A | 100 |零| 200|
|B | 10000 | 300 | 10|
|c |空| 10 | 100|
+------+--------+--------+--------+
第二个数据帧:df2:

+------+------+
|Col1 | col2|
+------+------+
|X | 1000|
|Y | 2002|
|Z | 3000|
+------+------+

我想读取表1中的值,如value1、value2和value3

使用新列将条件应用于表2:

条件1:当name=A和col2>value1时,将其标记为Y或N

条件2:当name=B和col2>值2时,则为Y或N

条件3:当name=c和col2>value1和col2>value3时,则为Y或N

源代码:

df2.withColumn("cond1",when($"col2")>value1,lit("Y)).otherwise(lit("N"))
df2.withColumn("cond2",when($"col2")>value2,lit("Y)).otherwise(lit("N"))
df2.withColumn("cond3",when($"col2")>value1 && when($"col2")>value3,lit("Y")).otherwise(lit("N"))
输出:

+------+------+-------+-------+-------+
|Col1 | col2 | cond1 | cond2 | cond3|
+------+------+-------+-------+-------+
|X | 1000 | Y | Y | Y|
|Y | 2002 | N | Y | Y|
|Z | 3000 | Y | Y | Y|
+------+------+-------+-------+-------+

您可以在两个
数据帧中创建
rowNo
列,如下所示

import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions._
val tempdf1 = df1.withColumn("rowNo", row_number().over(Window.orderBy("Name")))
val tempdf2 = df2.withColumn("rowNo", row_number().over(Window.orderBy("Col1")))
然后,您可以
将它们与下面创建的列连接起来

val joinedDF = tempdf2.join(tempdf1, Seq("rowNo"), "left")
最后,您可以使用
select
when
函数获取最终数据帧

joinedDF.select($"Col1",
  $"col2",
  when($"col2">$"value1" || $"value1".isNull, "Y").otherwise("N").as("cond1"),
  when($"col2">$"value2" || $"value2".isNull, "Y").otherwise("N").as("cond2"),
  when(($"col2">$"value1" && $"col2">$"value3") || $"value3".isNull, "Y").otherwise("N").as("cond3"))
您应该将所需的数据帧设置为

+----+----+-----+-----+-----+
|Col1|col2|cond1|cond2|cond3|
+----+----+-----+-----+-----+
|X   |1000|Y    |Y    |Y    |
|Y   |2002|N    |Y    |Y    |
|Z   |3000|Y    |Y    |Y    |
+----+----+-----+-----+-----+

我希望答案是有帮助的

如果我正确理解了您的问题,您可以将两个数据帧合并并创建如下所示的条件列。几点注意:

1) 在所述条件下,df1中的
null
替换为
Int.MinValue
,以简化整数比较

2) 由于df1很小,
broadcast
join用于最小化排序/洗牌以获得更好的性能

val df1 = Seq(
  ("A", 100, Int.MinValue, 200),
  ("B", 10000, 300, 10),
  ("C", Int.MinValue, 10, 100)
).toDF("Name", "value1", "value2", "value3")

val df2 = Seq(
  ("A", 1000),
  ("B", 2002),
  ("C", 3000),
  ("A", 5000),
  ("A", 150),
  ("B", 250),
  ("B", 12000),
  ("C", 50)
).toDF("Col1", "col2")

val df3 = df2.join(broadcast(df1), df2("Col1") === df1("Name")).select(
  df2("Col1"),
  df2("col2"),
  when(df2("col2") > df1("value1"), "Y").otherwise("N").as("cond1"),
  when(df2("col2") > df1("value2"), "Y").otherwise("N").as("cond2"),
  when(df2("col2") > df1("value1") && df2("col2") > df1("value3"), "Y").otherwise("N").as("cond3")
)

df3.show
+----+-----+-----+-----+-----+
|Col1| col2|cond1|cond2|cond3|
+----+-----+-----+-----+-----+
|   A| 1000|    Y|    Y|    Y|
|   B| 2002|    N|    Y|    N|
|   C| 3000|    Y|    Y|    Y|
|   A| 5000|    Y|    Y|    Y|
|   A|  150|    Y|    Y|    N|
|   B|  250|    N|    N|    N|
|   B|12000|    Y|    Y|    Y|
|   C|   50|    Y|    Y|    N|
+----+-----+-----+-----+-----+

两个数据帧之间的行是如何匹配的?我想从value1、value2、value3中读取存储在变量中的值,并基于变量应用条件value@vikv我想他要问的是,对于要匹配的行,df1中的“Name”列是否应该等于df2中的“Col1”。或者它是基于顺序还是其他?是的,shaido,这就是我所看到的我仍然不明白你的例子中的值1、值2和值3是什么。您是要添加这三个值,还是要对第一个df中的每一行执行此过程?感谢您的响应。但是如果df1和df2的行数不同,则此方案不起作用。在我的场景中,df1是3行的小表,但我的df2总是大的。刚才我给出了一个有问题的用例示例。如果是这样的话,那么对于df1有三行以上的数据和df2只有三行的数据,您如何比较?你能解释一下吗?df1的哪些行将与df2的哪些行进行比较?