如何在不使用数据帧的情况下将一行爆炸成多行?

时间:2019-04-12 16:12:29

标签: apache-spark-sql azure-databricks

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

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

1 个答案:

答案 0 :(得分:0)

快速解答:与flatMap()相比,SQL中没有内置功能可帮助您根据(字符串值和定界符)将行有效地分成多行或(Dataset API)中的explode()即可实现。

仅仅是因为在Dataframe中,您可以以编程方式操作Rows,其级别和粒度比Spark SQL高得多。

注意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()

Rows生成的一组新explode()替换值列,不赞成使用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|
+------+

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