在spark数据帧中创建子字符串列

时间:2017-03-15 22:43:02

标签: scala apache-spark spark-dataframe

我想获取一个json文件并映射它,以便其中一列是另一列的子串。例如,取左表并生成右表:

 ------------              ------------------------
|     a      |             |      a     |    b    |
|------------|       ->    |------------|---------|
|hello, world|             |hello, world|  hello  |

我可以使用spark-sql语法执行此操作,但如何使用内置函数完成?

5 个答案:

答案 0 :(得分:8)

可以使用这样的陈述

import org.apache.spark.sql.functions._

dataFrame.select(col("a"), substring_index(col("a"), ",", 1).as("b"))

答案 1 :(得分:5)

您可以使用withColumn功能

import org.apache.spark.sql.functions.{ udf, col }
def substringFn(str: String) = your substring code
val substring = udf(substringFn _)
dataframe.withColumn("b", substring(col("a"))

答案 2 :(得分:2)

假设您有以下数据框:

import spark.implicits._
import org.apache.spark.sql.functions._

var df = sc.parallelize(Seq(("foobar", "foo"))).toDF("a", "b")

+------+---+
|     a|  b|
+------+---+
|foobar|foo|
+------+---+

您可以按如下方式从第一列中对新列进行子集化:

df = df.select(col("*"), substring(col("a"), 4, 6).as("c"))

+------+---+---+
|     a|  b|  c|
+------+---+---+
|foobar|foo|bar|
+------+---+---+

答案 3 :(得分:1)

您可以仅使用pyspark方式进行操作,如以下示例所示:

df.withColumn('New_col', df['Old_col'].substr(0, 7)).show()

答案 4 :(得分:0)

只是为了丰富现有答案。如果您对字符串列的右侧部分感兴趣。那就是:

 ------------              ------------------------
|     a      |             |      a     |    b    |
|------------|       ->    |------------|---------|
|hello, world|             |hello, world|  world  |

您应该使用负索引:

dataFrame.select(col("a"), substring_index(col("a"), ",", -1).as("b"))