如何在不使用数据框的情况下将一行分解为多行?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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|
+------+

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

【讨论】:

以上是关于如何在不使用数据框的情况下将一行分解为多行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不丢失setfocus的情况下将光标设置到文本框的末尾?

如何在不破坏单词的情况下将字符串拆分为行?

如何在不使用画布的情况下将整个 div 数据转换为图像并将其保存到目录中?

如何在不使用共享首选项的情况下将数据存储为颤动的对象[关闭]

在不创建存储过程的情况下,如何在 Oracle 中将多行连接成一行? [复制]

如何在不丢失 exif 数据的情况下将 UIImage 转换为 JPEG?