将字符串的一部分转换为数据帧的不同列

时间:2019-11-24 12:22:37

标签: apache-spark pyspark azure-databricks

我有一个包含两个列的json文件。第二列是一个字符串。该字符串的结构如下所示:

"x#y#z"
"aa#bbc#cd"

因此,字符串由多个子字符串组成,以#分隔。每行的子字符串数相同。 我想将字符串拆分为数据帧的列,我可以使用一些子字符串函数来实现,但是正在寻找一种更简单的方法,特别是因为我的真实数据有20个子字符串。这是我当前的pyspark代码:

data = """
{"a":1, "b":"x#y#z"}
{"a":2, "b":"aa#bbc#cd"}
"""

dbutils.fs.put(inputpath + "/001.json", data, True)

from pyspark.sql.functions import *

df = spark.read.format("json").load(inputpath) \
  .select ("a", "b").withColumn("b1", substring_index('b', "#", 1)) 

df.show()

+---+---------+---+
|  a|        b| b1|
+---+---------+---+
|  1|    x#y#z|  x|
|  2|aa#bbc#cd| aa|
+---+---------+---+

1 个答案:

答案 0 :(得分:0)

您可以为此使用split(请参见here)。它在模式周围分割字符串(模式是一个正则表达式)。结果是一个数组。这样,您可以轻松访问字符串中的元素:

from pyspark.sql.functions import *

df = spark.read.format("json").load(inputpath) \
  .select ("a", "b").withColumn("c", split("b", "#")) \
  .selectExpr("a", "b", "c", "c[0] as b0", "c[1] as b0", "c[2] as b2") 

数据框将如下所示:

+---+---------+-------------+---+---+---+
|  a|        b|            c| b0| b0| b2|
+---+---------+-------------+---+---+---+
|  1|    x#y#z|    [x, y, z]|  x|  y|  z|
|  2|aa#bbc#cd|[aa, bbc, cd]| aa|bbc| cd|
+---+---------+-------------+---+---+---+

希望这会有所帮助。