【问题标题】:How to explode a row into multiple rows without using data frames?如何在不使用数据框的情况下将一行分解为多行?
【发布时间】:2019-04-12 16:12:29
【问题描述】:

我创建了数据框,用于根据分隔符将一行分解为多行。我已经使用了爆炸功能。想知道我是否可以通过这里使用数据框并仅使用 SparkSQL 来执行此操作。

例如,teradata 中有 Strtok 函数来执行此操作。

【问题讨论】:

    标签: apache-spark-sql azure-databricks


    【解决方案1】:

    快速回答:与 flatMap() 或 @ 相比,SQL 中没有内置函数可以帮助您根据(字符串值和分隔符)有效地将一行拆分为多行987654324@ in (Dataset API) 可以实现。

    原因很简单,因为在 Dataframe 中,您可以以比 Spark SQL 更高的级别和粒度以编程方式操作 Rows

    注意: Dataset.explode() 从 (Spark 2.0) 开始已弃用

    explode() 已弃用:(从 2.0.0 版开始)使用 flatMap() 或 select() functions.explode() 代替

    以下是前面引用中推荐的两种方法的两个示例。

    示例

    // Loading testing data
    val mockedData = sc.parallelize(Seq("hello, world", "foo, bar")).toDF
    +------------+
    |       value|
    +------------+
    |hello, world|
    |    foo, bar|
    +------------+
    

    选项 1 - flatMap()

    使用flatMap()将行分成多个

    scala> mockedData.flatMap( r => r.getString(0).split(",")).show
    +------+
    | value|
    +------+
    | hello|
    | world|
    |   foo|
    |   bar|
    +------+
    

    选项 2 - functions.explode()

    explode() 生成的一组新Rows 替换值列,不推荐使用flatMap()

    scala> mockedData.withColumn("value", explode(split($"value", "[,]"))).show
    +------+
    | value|
    +------+
    | hello|
    | world|
    |   foo|
    |   bar|
    +------+
    

    切换到 Spark SQL API:

    如果你想使用 sqlContext,并开始通过 SQL 查询数据,现在你可以从结果数据集中创建一个临时视图:

    scala> val resultedDf = mockedData.flatMap( r => r.getString(0).split(","))
    resultedDf: org.apache.spark.sql.Dataset[String] = [value: string]
    
    scala> resultedDf.createOrReplaceTempView("temp")
    
    scala> spark.sql("select * from temp").show
    +------+
    | value|
    +------+
    | hello|
    | world|
    |   foo|
    |   bar|
    +------+
    

    我希望这能回答你的问题。

    【讨论】:

      猜你喜欢
      • 2022-09-23
      • 2021-06-09
      • 2017-02-12
      • 2015-08-31
      • 1970-01-01
      • 2020-06-03
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多