我正在尝试使用spark 1.6读取CSV文件
s.no|Name$id|designation|salry
1 |abc$12 |xxx |yyyval df = spark.read.format("csv")
.option("header","true")
.option("delimiter","|")
.load("path")如果我添加了带有$ it抛出错误的分隔符,则允许一个分隔符
发布于 2020-04-06 19:27:17
在使用主分隔符(为了更好地理解,我引用"|“作为主分隔符)从源中读取数据帧之后,您可以应用操作。
您可以执行如下操作:
sc是Sparksession
val inputDF = sc.read.option("inferSchema", "true")
.option("header", "true")
.option("delimiter", "|")
.csv("/path/to/your/file")
val modifiedDF = inputDF
.withColumn("Name", split(inputDF.col("Name$id"), "\\$")(0))
.withColumn("id", split(inputDF.col("Name$id"), "\\$")(1)).drop("Name$id")
modifiedDF.show(false) will give you the required output尽管这可能会导致数据被错误地拆分,因为数据中存在有效的"$“符号,而该符号被错误地视为分隔符。因此,您应该在这些情况下使用预防措施。
有一个库,不记得它的名字,但它可以是单一的,这让你可以选择将多个符号作为单个分隔符,比如#@作为分隔符。如果您的用例是为每一列使用多个分隔符,您可以稍微搜索一下。
发布于 2020-04-06 18:53:51
我能问一下你为什么要用spark 1.6吗?无论如何,在读取csv格式时,只允许使用一个分隔符。
如果它是一个特定的列,您知道它有一列,其值的格式为: name$id
也许可以尝试在该列上运行一些逻辑,并获得具有2个新列的df
设置df
al df = sc.parallelize(a).toDF("nameid")
df: org.apache.spark.sql.DataFrame = [nameid: string]尝试如下所示:
df.withColumn("name",substring_index(col("nameid"), "$", 1)).withColumn("id", substring_index(col("nameid"), "$", -1)).show和输出
+-------+----+---+
| nameid|name| id|
+-------+----+---+
|name$id|name| id|
+-------+----+---+您还可以在此之后删除原始列
希望这能有所帮助
https://stackoverflow.com/questions/61057630
复制相似问题