使用Spark SQL在多列中拆分列

时间:2018-03-21 15:33:11

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

我有一个代表GPS坐标格式的专栏col1

  

25 4.1866N 55 8.3824E

我想基于空格作为分隔符将其拆分为多个列,如下面的输出示例table_example所示:

| 1st_split  | 2nd_split   | 3rd_split    | 4th_split    |
|:-----------|------------:|:------------:|:------------:|
|    25      |   4.1866N   |     55       |     8.3824E  |

考虑到存在split()函数,我尝试过这种方式:

SELECT explode(split(`col1`, ' ')) AS `col` FROM table_example;

但是,不是每多个列拆分,而是按每个行拆分,如下面的输出所示:

output

有人可以澄清一下获得预期结果的价值方法吗?

1 个答案:

答案 0 :(得分:1)

如果您的数据框为

+---------------------+
|col                  |
+---------------------+
|25 4.1866N 55 8.3824E|
+---------------------+

使用Scala API

您可以简单地使用split 内置函数select作为

import org.apache.spark.sql.functions._
df.withColumn("split", split(col("col"), " "))
    .select(col("split")(0).as("1st_split"), col("split")(1).as("2nd_split"),col("split")(2).as("3rd_split"),col("split")(3).as("4th_split"))
  .show(false)

会给你

+---------+---------+---------+---------+
|1st_split|2nd_split|3rd_split|4th_split|
+---------+---------+---------+---------+
|25       |4.1866N  |55       |8.3824E  |
+---------+---------+---------+---------+

使用SQL方式

Sql更容易,与api方式类似

df.createOrReplaceTempView("table_example")
val splitted = sqlContext.sql("SELECT split(`col`, ' ') AS `col` FROM table_example")

splitted.createOrReplaceTempView("splitted_table")
val result = sqlContext.sql("SELECT `col`[0] AS `1st_split`, `col`[1] AS `2nd_split`, `col`[2] AS `3rd_split`, `col`[3] AS `4th_split` FROM splitted_table")
result.show(false)

我希望答案很有帮助