替换用作分隔符的字符PySpark CSV

bqucvtff  于 2023-06-19  发布在  Spark
关注(0)|答案(2)|浏览(106)

我有一个CSV文件,我用PySpark在Databricks中读取了代码:

df =spark.read.options(delimiter='|',header=True ,multiLine=True).schema(schema).csv('/mnt/file.csv')

我正在阅读多个文件顺序所有CSV与分隔符|
问题是我的文件中的一个字段有多个|这显然会使所有的dataframe都出错(我甚至不能保存它,因为Timestamp字段被一个String字段填充)。
我不知道在哪个文件中会发生这种情况,在哪个字段中,我没有任何引用(例如")可以使用。我甚至不能在文件中修改它,因为我有超过1000个文件,其中一些超过10 GB。
我能找到解决这个问题的变通方法吗?
我试着这样做:

df =spark.read.options(delimiter=',',header=True, multiLine=True, inferSchema=True).csv('/mnt/file.csv')
df.withColumn('header|in|one|row', regexp_replace('header|in|one|row', 'text||||text2', 'text text2'))

但它不起作用('文本||||text2'这是一个错误让我看到的例子)

h79rfbju

h79rfbju1#

您可以定义文件的schema,并使用header True读取文件并传递模式。
在这种情况下,spark将读取头并将模式添加到dataframe。

Example:

from pyspark.sql.types import *

sch = StructType([
    StructField("A", IntegerType()),
    StructField("B", DoubleType()),
    StructField("C", StringType())
])
df =spark.read.options(schema = sch, delimiter=',',header=True, multiLine=True, inferSchema=True).csv('/mnt/file.csv')
py49o6xq

py49o6xq2#

  • 我有一个具有|分隔符的文件,其中一个字段的值具有连续的|字符。我使用文本格式读取了文件,以下是dataframe结果:
df = spark.read.text('dbfs:/FileStore/sample1__1_.csv')
df.show(truncate=False)

  • 使用regex_replace function, I was able to replace any trace of multiple|“人物。下面是我使用的代码:
from pyspark.sql.functions import *

df1 = df.withColumn('value', regexp_replace('value', r'\|{2,}', ' '))
df1.show(truncate=False)

  • 然后我把它以文本格式写了回来。但是当我读取它时,我使用csv格式读取它,分隔符为|,并获得适当的结果:
df =spark.read.options(delimiter='|',header=True, multiLine=True, inferSchema=True).csv('/FileStore/final')
df.show(truncate=False)

    • 注:**
  • 只有当字段值中有多个|字符时,此操作才有效。如果值中只有一个随机|,则无法将其与分隔符区分开。
  • 此外,只有当字段的值不包含多个|字符时,这才有效。如果是这种情况,则这些附加字符与实际的列分隔符混合,因此不能解决问题。这是解决特定情况的一种可能方法。

相关问题