Python pyspark拆分csv,字符串中带空格-jupyter笔记本

Python pyspark拆分csv,字符串中带空格-jupyter笔记本,python,regex,pyspark,spark-dataframe,Python,Regex,Pyspark,Spark Dataframe,我不想读取文本文件,我想在现有数据帧上执行操作 我的数据框只有一列文本,就像文件“tabSeparator”一样 它是一个结构化的文件,有3列,分隔符是一个选项卡。 如果该列有嵌入式选项卡,则会用双引号括起来(“xxx xx”) 例如: ------------------------- col_0 ------------------------- c11 c12 c13 c21 c22 c23 "c 31" "c 32" c33 我正在使用这个正则表达式: 我正在将pysp

我不想读取文本文件,我想在现有数据帧上执行操作

我的数据框只有一列文本,就像文件“tabSeparator”一样

它是一个结构化的文件,有3列,分隔符是一个选项卡。 如果该列有嵌入式选项卡,则会用双引号括起来(
“xxx xx”

例如:

-------------------------
col_0
-------------------------
c11   c12    c13
c21 c22 c23   
"c 31" "c 32" c33
我正在使用这个正则表达式: 我正在将pysparkJupyter笔记本一起使用

myre = '([\\t ]?(\\".*?\\"|[^\\t ]+))'

df = textDF.withColumn("tmp", split( col("_c0"), myre))\
      .select(\
        col("tmp").getItem(0).alias("col_1"),\
        col("tmp").getItem(1).alias("col_2"),\
        col("tmp").getItem(2).alias("col_3")
      )
不确定问题是否出在正则表达式或我解析文件的方式上,但我无法使用解析的3列创建新的DataFrame,结果

-------------------
|col_1|col_2|col_3|
------+-----+------
| c11 | c12 | c13 |
| c21 | c22 | c23 |  
| c 31| c 32| c 33|
-------------------

显然,你的问题是有两个可能的分隔符

对于DataFrames,只使用一个分隔符加载文件非常简单,例如制表符分隔符,它们被视为CSV文件,但不是逗号,而是一个制表符

在这个特定场景中,您可以这样阅读:

yourDF=spark.read.option(“分隔符”、“\t”).csv(“/tabSeparator/”)


但是如果你有多个,我相信唯一的选择就是使用正则表达式。您也可以使用RDD,编写更长的函数并使用map。

这不是csv reader无法处理的事情:

spark.read.option("delimiter", "\t").csv(path_to_file)
在Spark 2.3中,您可以对现有分布式数据结构执行以下操作:

df = spark.createDataFrame([
    'c11\tc12\tc13', 'c21\tc22\tc23', '"c\t31"\t"c\t32"\t"c\t33"'
], "string").toDF("col_0")


spark.read.option('delimiter', '\t').csv(df.rdd.map(lambda x: x.col_0)).show()


# +----+----+----+
# | _c0| _c1| _c2|
# +----+----+----+
# | c11| c12| c13|
# | c21| c22| c23|
# |c    31|c    32|c    33|
# +----+----+----+
带有
csv
的UDF可能在2.2版Python 3中工作,但速度较慢:

from pyspark.sql.functions import udf
import csv

@udf("struct<c0:string,c1:string,c2:string>")
def csv_(s):
    try:
        return next(csv.reader([s], delimiter="\t"))
    except: pass

df.select(csv_("col_0").alias("tmp")).select("tmp.*").show()

# +----+----+----+
# |  c0|  c1|  c2|
# +----+----+----+
# | c11| c12| c13|
# | c21| c22| c23|
# |c    31|c    32|c    33|
# +----+----+----+
从pyspark.sql.functions导入udf
导入csv
@自定义项(“结构”)
def csv_uUs:
尝试:
返回下一个(csv.reader([s],分隔符=“\t”))
除了:通过
df.select(csv_uu(“col_u0”).alias(“tmp”)).select(“tmp.*).show()
# +----+----+----+
#| c0 | c1 | c2|
# +----+----+----+
#| c11 | c12 | c13|
#| c21 | c22 | c23|
#| c31 | c32 | c33|
# +----+----+----+

我已经有一个数据帧,只有一列!问题是如何解析它并创建3列。您可以假定tab是唯一的分隔符。我不想像你建议的那样读这个文件,因为它不存在。谢谢你的否决票,我只是想帮你:)如果你读了最后一部分,你会发现有一个选项可以使用RDD和一个简单的按选项卡拆分,但是你可以使用SerDe来引用。