【问题标题】:Spark 2.2 Scala DataFrame select from string array, catching errorsSpark 2.2 Scala DataFrame 从字符串数组中选择,捕获错误
【发布时间】:2017-12-08 04:38:04
【问题描述】:

我是 SparkSQL/Scala 的新手,我正在为几个看似简单的任务而苦苦挣扎。

我正在尝试从 Scala 字符串数组构建一些动态 SQL。我正在尝试在我的 DataFrame 中重新键入一些列,但在运行时我可以看到 DataFrame 中的列集之前,我不会确切知道我需要重新键入哪些列。所以我正在尝试这样做:

val cols = df.columns
val typedCols = cols.map( c => getTypedColumn(c) )
df.select( ...)  or df.selectExpr(...) // how to invoke this with vals from my string array??

typedCols 最终会成为一个字符串数组,其值如下:

["a", "cast(b as int) b", "c"]

我需要先从那个数组创建一个大逗号分隔的字符串吗?

因此,假设这可行,我将调用该 select 语句,它会将我的 DataFrame 转换为具有我所需类型的新 DataFrame。但是 DataFrame 中的一些记录会出现错误,并且尝试重新输入会失败。

如何获得包含所有通过输入的好记录的 DataFrame 结果,然后将所有坏记录扔到某种错误桶中?在尝试 DataFrame 选择之前,我是否需要先通过验证?

【问题讨论】:

    标签: scala apache-spark apache-spark-sql spark-dataframe


    【解决方案1】:

    你可以只使用可变参数:

    val df = Seq(("a", "1", "c"), ("foo", "bar", "baz")).toDF("a", "b", "c")
    val typedCols = Array("a", "cast(b as int) b", "c")
    df.selectExpr(typedCols: _*).show
    
    +---+----+---+
    |  a|   b|  c|
    +---+----+---+
    |  a|   1|  c|
    |foo|null|baz|
    +---+----+---+
    

    但我个人更喜欢列:

    val typedCols = Array($"a", $"b" cast "int", $"c")
    df.select(typedCols: _*).show
    

    如何获得包含所有通过输入的好记录的 DataFrame 结果,然后将所有坏记录扔到某种错误桶中?

    cast 失败的数据是NULL。要查找好的记录,请使用na.drop

    val result = df.selectExpr(typedCols: _*)
    val good = result.na.drop()
    

    查找错误检查是否有NULL

    import org.apache.spark.sql.functions.col
    
    val bad = result.where(result.columns.map(col(_).isNull).reduce(_ || _))
    

    获取不匹配的数据:

    • 如果typedColsSeq[Column] 你可以

      df.where(typedCols.map(_.isNull).reduce(_ || _))  
      
    • 如果typedColsSeq[String],您可以:

      import org.apache.spark.sql.functions.expr
      
      df.where(typedCols.map(expr(_).isNull).reduce(_ || _))  
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      相关资源
      最近更新 更多