我有以下格式的数据。
abc, x1, x2, x3
def, x1, x3, x4,x8,x9
ghi, x7, x10, x11
我想要的输出是
0,abc, [x1, x2, x3]
1,def, [x1, x3, x4,x8,x9]
2,ghi, [x7, x10, x11]
答案 0 :(得分:1)
您的数据不是CSV格式。 CSV表示具有固定模式的逗号分隔文本文件。您数据的CSV为:
abc,x1,x2,x3,,
def,x1,x3,x4,x8,x9
ghi,x7,x10,x11,,
请注意第1行和第3行中的尾部逗号,这些逗号不在您的数据中。
由于您有一个不是CSV的文本文件,因此在Spark中获取所需模式的方法是在Python中读取整个文件,解析为所需内容,然后使用spark.crateDataFrame()
。或者,如果目录中有多个这样的文件,请使用SparkContext.wholeTextFiles
,然后使用flatMap
的解析函数。
假设您已经做过open("Your File.txt").readlines
之类的事情,其余的很简单:
import re
from pyspark.sql import *
lines = [
"abc, x1, x2, x3",
"def, x1, x3, x4,x8,x9",
"ghi, x7, x10, x11"
]
split = re.compile("\s*,\s*")
Line = Row("id", "first", "rest")
def parse_line(id, line):
tokens = split.split(line.strip)
return Line(id, tokens[0], tokens.pop(0))
def parse_lines(lines):
return [parse_line(i, x) for i,x in enumerate(lines)]
spark.createDataFrame(parse_lines(lines))
答案 1 :(得分:1)
您可以做的是先使用zipWithIndex
生成id,然后在map函数内部使用r[0].split(",")[0]
生成字符串的第一部分,然后使用r[0].split(",")[1:]
生成字符串的第二部分。
这是上面描述的代码:
from pyspark.sql.types import StringType
lines = ["abc, x1, x2, x3",
"def, x1, x3, x4,x8,x9",
"ghi, x7, x10, x11"]
df = spark.createDataFrame(lines, StringType())
df = df.rdd.zipWithIndex() \
.map(lambda (r, indx): (indx, r[0].split(",")[0], r[0].split(",")[1:])) \
.toDF(["id", "name", "x_col"])
df.show(10, False)
输出:
+---+----+-----------------------+
|id |name|x_col |
+---+----+-----------------------+
|0 |abc |[ x1, x2, x3] |
|1 |def |[ x1, x3, x4, x8, x9]|
|2 |ghi |[ x7, x10, x11] |
+---+----+-----------------------+
答案 2 :(得分:0)
如果数据进入文件,可以通过以下方式实现:
在Scala上可以通过以下方式实现:
val df = spark.read.option("header", "false").csv("non-csv.txt")
val remainingColumns = df.columns.tail
df.withColumn("id", monotonically_increasing_id).
select(
col("id"),
col(df.columns(0)),
array(remainingColumns.head, remainingColumns.tail: _*)
).show(false)
输出:
+---+---+--------------------+
|id |_c0|array(_c1, _c2, _c3)|
+---+---+--------------------+
|0 |abc|[ x1, x2, x3] |
|1 |def|[ x1, x3, x4] |
|2 |ghi|[ x7, x10, x11] |
+---+---+--------------------+