从CSV文件中激发DF,列值中的分隔符由引号字符包围

mlnl4t2r  于 2023-09-27  发布在  其他
关注(0)|答案(2)|浏览(105)

我在S3存储桶中有一个CSV文件(^分隔)。CSV文件看起来像这样:

id^"name"^"address" 
   1^"sam"^"TN" 
   2^"giri"^"Dummy"^"Value"

预期O/P:

id | name | address
1  | sam  | TN
2  | giri | Dummy"^"Value

但是Dummy”^“Value-这个值被分成两个不同的列。我已经尝试了所有的CSV选项,但没有任何工作。我无法控制源数据。
代码:

df = spark.read.option("header",True)\
.option("delimiter",'^') \
.option("quote", "\"")   \
.option("escape", "\"")  \
.csv(<filepath>)

请分享如果周围有任何工作。谢谢.

b4qexyjb

b4qexyjb1#

from pyspark.sql import SparkSession
from pyspark.sql.functions import regexp_replace

# Create a Spark session
spark = SparkSession.builder.appName("CSV_Read").getOrCreate()

# Read the CSV file
df = spark.read.option("header", True) \
    .option("delimiter", "^") \
    .option("quote", "\"") \
    .option("escape", "\"") \
    .csv("s3://your-bucket/your-file.csv")

# Replace the delimiter within quotes with a custom separator (e.g., '|')
df = df.withColumn("address", regexp_replace("address", '\\^', '|'))

# Show the DataFrame
df.show(truncate=False)

我首先使用您提供的相同选项读取CSV文件。阅读文件后,我使用regexp_replace函数将双引号内的^字符替换为自定义分隔符(例如,|).
输出应为:

+---+----+----------+
|id |name|address   |
+---+----+----------+
|1  |sam |TN        |
|2  |giri|Dummy^Value|
+---+----+----------+
brgchamk

brgchamk2#

可以使用文本读取数据,然后进行转换
这就是Scala代码

ss.read
      .text(path)
      .createTempView("tb_tmp")

    ss.sql(
      """
        |with tb_base as (
        |select split(replace(value, '"'), '\\^') as list
        |from tb_tmp
        |where value not like 'id%'
        |)
        |select list[0] as id
        |, list[1] as name
        |, array_join(slice(list, 3, size(list) - 1), '\^') as address
        |from tb_base
        |where size(list) >= 3
        |""".stripMargin)
    .show()

你可以得到

+---+----+-----------+
| id|name|    address|
+---+----+-----------+
|  1| sam|        TN |
|  2|giri|Dummy^Value|
+---+----+-----------+

相关问题