我在使用分隔符' |'分割文本数据文件时遇到了困难。到数据框列。 我加载的数据文件如下所示:
results1.show()
+--------------------+
| all|
+--------------------+
|DEPT_NO|ART_GRP_N...|
|29|102|354814|SKO...|
|29|102|342677|SKO...|
|29|102|334634|DUR...|
|29|102|319337|SKO...|
|29|102|316731|DUR...|
|29|102|316728|DUR...|
|29|102|316702|DUR...|
|29|102|316702|DUR...|
|29|102|276728|I-P...|
我在之前的帖子中尝试了以下两种方法:
results1.select(expr("(split(all, '|'))[1]").cast("integer").as("DEPT_NO"),expr("(split(all, '|'))[4]").cast("integer").as("ART_GRP_NO"), expr("(split(all, '|'))[8]").cast("string").as("ART_NO")).show
+-------+----------+------+
|DEPT_NO|ART_GRP_NO|ART_NO|
+-------+----------+------+
| null| null| ||
| 2| 1| 3|
| 2| 1| 3|
| 2| 1| 3|
| 2| 1| 3|
| 2| 1| 3|
| 2| 1| 3|
| 2| 1| 3|
| 2| 1| 3|
| 2| 1| 2|
和
val dataframe10= sc.textFile(("D:/data/dnr10.txt")
.toString())
.map(_.split("|"))
.map(c => {(c(1), c(2),c(3),c(4))})
.toDF()
.show()
+---+---+---+---+
| _1| _2| _3| _4|
+---+---+---+---+
| D| E| P| T|
| 2| 9| || 1|
| 2| 9| || 1|
| 2| 9| || 1|
| 2| 9| || 1|
| 2| 9| || 1|
| 2| 9| || 1|
| 2| 9| || 1|
| 2| 9| || 1|
| 2| 9| || 1|
| 2| 7| || 4|
看起来分隔符无法识别,因为分割是在每个字符之后完成的,而不是在每个字符之后完成的。' |'。有人可以告诉我如何在这种情况下获得正确的拆分过程吗?
答案 0 :(得分:5)
使用RDD API :您的错误是String.split
需要正则表达式,其中pipe("|"
)是一个特殊字符含义& #34; OR",所以它分裂任何。另外 - 在将数组转换为元组时,您应该从索引0开始
修复很简单 - 逃避这个角色:
sc.textFile("D:/data/dnr10.txt")
.map(_.split("\\|"))
.map(c => (c(0),c(1),c(2),c(3)))
.toDF()
使用Dataframe API :转义管道的问题同样适用于此处。另外,您可以通过拆分一次并在选择列时多次使用该拆分列来简化代码:
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types.IntegerType
results1.withColumn("split", split($"all", "\\|")).select(
$"split" getItem 0 cast IntegerType as "DEPT_NO",
$"split" getItem 3 cast IntegerType as "ART_GRP_NO",
$"split" getItem 7 as "ART_NO"
)
使用Spark 2.0内置CSV支持:如果您正在使用Spark 2.0+,您可以让框架为您完成所有艰苦工作 - 使用格式" csv& #34;并将分隔符设置为管道符:
val result = sqlContext.read
.option("header", "true")
.option("delimiter", "|")
.option("inferSchema", "true")
.format("csv")
.load("D:/data/dnr10.txt")
result.show()
// +-------+----------+------+---+
// |DEPT_NO|ART_GRP_NO|ART_NO| TT|
// +-------+----------+------+---+
// | 29| 102|354814|SKO|
// | 29| 102|342677|SKO|
// | 29| 102|334634|DUR|
// | 29| 102|276728|I-P|
// +-------+----------+------+---+
result.printSchema()
// root
// |-- DEPT_NO: integer (nullable = true)
// |-- ART_GRP_NO: integer (nullable = true)
// |-- ART_NO: integer (nullable = true)
// |-- TT: string (nullable = true)
您将获得列名称,正确的类型 - 所有内容......:)