【问题标题】:How to use join with gt condition in Java?如何在Java中使用带有gt条件的join?
【发布时间】:2017-04-03 12:47:29
【问题描述】:

我想根据以下条件加入两个数据框:如果 df1.col("name")== df2.col("name") 和 df1.col("starttime") 大于 df2.col( “开始时间”)。

条件的第一部分没问题,我在spark sql中使用列类的“等于”方法,但是对于“大于”条件,当我在java中使用以下语法时:

df1.col("starttime").gt(df2.col("starttime"))

不起作用,好像spark sql中column的“gt”函数,只接受数值类型,当你将column类型作为输入参数时它不能正常工作。程序正常完成但结果错误,它没有在数据框中找到任何满足我条件的行,而我知道数据框中存在这样的行。

关于我应该如何在 spark sql 中实现两种列类型之间的比较的任何想法?(例如,如果一列大于另一个数据框中的另一列)

【问题讨论】:

  • 不清楚“一列大于另一列”是什么意思。请添加示例。
  • 如何使用连接表达式并传递带有 hive/sql 条件的字符串?
  • 如何使用连接表达式并传递带有 sql 条件的字符串?
  • 我的错误。它不能在字符串中完成。

标签: java apache-spark apache-spark-sql


【解决方案1】:

我运行了以下代码:

    HiveContext sqlContext = new HiveContext(sc);

    List<Event> list = new ArrayList<>();
    list.add(new Event(1, "event1", Timestamp.valueOf("2017-01-01 00:00:00"), Timestamp.valueOf("2017-01-03 00:00:00")));
    list.add(new Event(2, "event2", Timestamp.valueOf("2017-01-02 00:00:00"), Timestamp.valueOf("2017-01-03 00:00:00")));

    List<Event> list2 = new ArrayList<>();
    list2.add(new Event(1, "event11", Timestamp.valueOf("2017-01-02 00:00:00"), Timestamp.valueOf("2017-01-10 00:00:00")));
    list2.add(new Event(2, "event22", Timestamp.valueOf("2017-01-01 00:00:00"), Timestamp.valueOf("2017-01-15 00:00:00")));

    DataFrame df1 = getDF(sc, sqlContext, list);
    DataFrame df2 = getDF(sc, sqlContext, list2);

    df1.join(df2,df1.col("startTime").gt(df2.col("startTime"))).show();

这是我得到的结果:

+---+------+--------------------+--------------------+---+-------+--------------------+--------------------+
| id|  name|           startTime|             endTime| id|   name|           startTime|             endTime|
+---+------+--------------------+--------------------+---+-------+--------------------+--------------------+
|  2|event2|2017-01-02 00:00:...|2017-01-03 00:00:...|  2|event22|2017-01-01 00:00:...|2017-01-15 00:00:...|
+---+------+--------------------+--------------------+---+-------+--------------------+--------------------+

在我看来,它按预期工作。

此外,spark 代码(此处为 1.6 版)也说了同样的话。

【讨论】:

    【解决方案2】:

    先将org.apache.spark.sql.functions.to_utc_timestamp 应用到列后,再尝试应用.gt

    rdd1.toDF("date1", ...)
        .join(rdd2.toDF("date2", ...), to_utc_timestamp('date1, pattern).gt(to_utc_timestamp('date2, pattern))
    

    其中pattern 提供时间戳字符串的格式。

    【讨论】:

    • 你能说得更具体点吗?好像没有编译?或者它编译但在运行时产生异常?或者这一切都执行得很好,但产生了你不想要的结果?在这里获得帮助非常重要。
    • 程序正常结束但结果错误,在dataframe中没有找到满足我条件的行,而我知道dataframe中存在这样的行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多