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



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

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

快速回答:与flatMap()explode()中的 (数据集 API) 可以实现的功能相比,SQL 中没有内置函数可以帮助您有效地根据(字符串值和分隔符)将行分解为多行。

简单地说,这是因为在数据帧中,您可以以编程方式以比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|
+------+

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

相关内容

  • 没有找到相关文章

最新更新