java中无重复列的sparkDataframe连接方法

stszievb  于 2021-07-12  发布在  Spark
关注(0)|答案(4)|浏览(474)

如果没有重复的列,我们如何合并2个Dataframe

a.show()

+-----+-------------------+--------+------+
| Name|           LastTime|Duration|Status|
+-----+-------------------+--------+------+
|  Bob|2015-04-23 12:33:00|       1|logout|
|Alice|2015-04-20 12:33:00|       5| login|
+-----+-------------------+--------+------+

b.show()
+-----+-------------------+--------+------+
| Name|           LastTime|Duration|Status|
+-----+-------------------+--------+------+
|  Bob|2015-04-24 00:33:00|       1|login |
+-----+-------------------+--------+------+

我想通过使用dataframea中的整个数据来形成一个新的dataframe,但是使用dataframeb中的数据来更新行

+-----+-------------------+--------+------+
| Name|           LastTime|Duration|Status|
+-----+-------------------+--------+------+
|  Bob|2015-04-24 00:33:00|       1|login |
|Alice|2015-04-20 12:33:00|       5| login|
+-----+-------------------+--------+------+

我能够在scala中加入并形成Dataframe。但不能用java做。

DataFrame f=a.join(b,a.col("Name").equalsTo(b.col("Name")).and a.col("LastTime).equalsTo(b.col("LastTime).and(a.col("Duration").equalsTo(b.col("Duration"),"outer")

在这样执行join时,我得到了重复的列。

wrrgggsh

wrrgggsh1#

根据这个答案,一系列的列名在scala中解决了这个问题。
汉斯,把java列表转换成scala-seq应该由你来做。下面是您更正的示例代码:

DataFrame f = a.join(b,
    // Convert Java List to Scala Seq
    scala.collection.JavaConverters.asScalaIteratorConverter(
        Arrays.asList("Name", "LastTime", "Duration").iterator()
    ).asScala().toSeq(),
    "outer"
)
uqdfh47h

uqdfh47h2#

正确的方法是:(测试)

Dataset<Row> f = a.join(b,
// Convert Java List to Scala Seq
JavaConverters.collectionAsScalaIterableConverter(
    Arrays.asList("Name", "LastTime", "Duration"))
.asScala().toSeq(),
"outer"
)
camsedfj

camsedfj3#

我认为我们可以通过sparksql来尝试,也可以通过java来执行。

spark.sql("""SELECT a.Name as Name,
CASE WHEN b.Name is null THEN a.LastTime ELSE b.LastTime END AS LastTime,
CASE WHEN b.Name is null THEN a.Duration ELSE b.Duration END AS Duration,
CASE WHEN b.Name is null THEN a.Status ELSE b.Status END AS Status 
FROM a a left outer join  b b on a.Name=b.Name 
""").show(false)

+-----+-------------------+--------+------+
|Name |LastTime           |Duration|Status|
+-----+-------------------+--------+------+
|Bob  |2015-04-24 00:33:00|1       |login |
|Alice|2015-04-20 12:33:00|5       |login |
+-----+-------------------+--------+------+

可以根据用例更新连接条件

mrphzbgm

mrphzbgm4#

可以执行leftsemi连接(“leftsemi”),以避免数据集中的重复列。
请参见此处以供参考:http://www.techburps.com/misc/apache-spark-dataset-joins-in-java/129

相关问题