【问题标题】:Filter a spark dataframe based on column datatypes根据列数据类型过滤火花数据框
【发布时间】:2018-04-23 10:29:14
【问题描述】:

我有一个带有 col_a 和 col_b 的数据框,并且在我收到的镶木地板文件中都写为“字符串”。 col_b 可以是 int 或 string,我想过滤掉 col_b 不是 int 的所有行。

Input:
col_A   col_b
1       "abc"
2       "3"
3       "xyz"

Output:
col_a   col_b
2       3

我知道我需要进行类型转换,但不知道如何继续进行

【问题讨论】:

    标签: apache-spark dataframe


    【解决方案1】:

    这里真的不需要UDF。您可以将cast 列为int 列,它会在失败的任何地方返回null,然后过滤非空行。

    val df = Seq((1, "abc"),
                 (2, "3"),
                 (3, "xyz")).toDF("col_a", "col_b")
    
    df.filter( $"col_b".cast("int").isNotNull ).show
    
    //+-----+-----+
    //|col_a|col_b|
    //+-----+-----+
    //|    2|    3|
    //+-----+-----+
    

    【讨论】:

      【解决方案2】:

      您可以在数据帧上使用filter 操作来过滤非整数值。创建一个接受列值的 UDF,如果该值可以转换为 Int,则返回 true,否则返回 false

      //your original DF
      val df = Seq((1, "abc"),
        (2, "3"),
        (3, "xyz")).toDF("col_a", "col_b")
      
      //create a udf for filter function
      val isValueInt = udf((value: String) => Try(value.toInt).isSuccess)
      
      //apply the filter on DF
      df.filter(isValueInt($"col_b")).show(false)
      
      //    output
      //    +-----+-----+
      //    |col_a|col_b|
      //    +-----+-----+
      //    |1    |3    | 
      //    +-----+-----+
      

      【讨论】:

        猜你喜欢
        • 2015-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-04
        • 2020-08-09
        相关资源
        最近更新 更多