【问题标题】:Filtering a Dataset<Row> if month is in list of integers如果月份在整数列表中,则过滤 Dataset<Row>
【发布时间】:2019-11-28 06:32:26
【问题描述】:

我在 Java 中有一个 Spark 行数据集,看起来像这样。

+-------+-------------------+---------------+----------+--------------------+-----+
|item_id|          date_time|horizon_minutes|last_value|              values|label|
+-------+-------------------+---------------+----------+--------------------+-----+
|      8|2019-04-30 09:55:00|             15|       0.0|[0.0,0.0,0.0,0.0,...|  0.0|
|      8|2019-04-30 10:00:00|             15|       0.0|[0.0,0.0,0.0,0.0,...|  0.0|
|      8|2019-04-30 10:05:00|             15|       0.0|[0.0,0.0,0.0,0.0,...|  0.0|

我想过滤 Dataframe 以仅获取月份在整数列表中的那些行(例如 1、2、5、12)

我试过基于字符串的过滤功能

rowsDS.filter("month(date_time)" ???)

但我不知道如何包含整数条件的“isin 列表”。

我也尝试通过 lambda 函数进行过滤,但没有成功。

rowsDS.filter(row -> listofints.contains(row.getDate(1).getMonth()))
    Evaluation failed. Reason(s):
        Lambda expressions cannot be used in an evaluation expression

有什么简单的方法可以做到这一点吗?我最好使用 lambda 函数,因为我不太喜欢 SparkSQL 的基于字符串的过滤器,例如第一个示例。

【问题讨论】:

    标签: apache-spark apache-spark-sql apache-spark-mllib


    【解决方案1】:

    对于数据框:

    val result = df.where(month($"date_time").isin(2, 3, 4))
    

    在 Java 中:

    Dataset<Row> result = df.where(month(col("date_time")).isin(2, 3, 4));
    

    在Java中获取“col”和“month”函数:

    import static org.apache.spark.sql.functions.*;
    

    【讨论】:

    • 对不起。我忘了说这是Java
    • testingData.where(month(testingData.col("date_time")).isin(2, 3, 4)) 因为您需要 testingData.col 部分来获取该列。仍然没有月份功能
    • spark.apache.org/docs/2.3.0/api/java/… public static Column month(Column e) 从给定的日期/时间戳/字符串中提取月份作为整数。
    【解决方案2】:

    您可以按照herehere 的描述定义UDF

    我的例子:

    val seq1 = Seq(
      ("A", "abc", 0.1, 0.0, 0),
      ("B", "def", 0.15, 0.5, 0),
      ("C", "ghi", 0.2, 0.2, 1),
      ("D", "jkl", 1.1, 0.1, 0),
      ("E", "mno", 0.1, 0.1, 0)
    )
    
    val ls = List("A", "B")
    val df1 = ss.sparkContext.makeRDD(seq1).toDF("cA", "cB", "cC", "cD", "cE")
    
    def rawFilterFunc(r: String) =  ls.contains(r)
    
    ss.udf.register("ff", rawFilterFunc _)
    
    df1.filter(callUDF("ff", df1("cA"))).show()
    

    给出输出:

    +---+---+----+---+---+
    | cA| cB|  cC| cD| cE|
    +---+---+----+---+---+
    |  A|abc| 0.1|0.0|  0|
    |  B|def|0.15|0.5|  0|
    +---+---+----+---+---+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 2021-05-18
      • 2019-04-14
      • 1970-01-01
      • 2019-10-08
      相关资源
      最近更新 更多