【问题标题】:How to ignore double quotes in Spark Dataframe where we read the input data from CSV?如何忽略我们从 CSV 读取输入数据的 Spark Dataframe 中的双引号?
【发布时间】:2020-05-07 19:56:34
【问题描述】:

我想通过读取来自 csv 文件的输入来创建一个 Spark 数据框(不带双引号),如下所述。

这是我的代码,但目前没有用。

val empDF = spark.read.format("com.databricks.spark.csv")
  .option("header", "true")
  .option("inferSchema", "true")
  .option("quote", "\"")
  .option("escape", "\"")
  .load("EmpWithQuotes.csv")
  .toDF()

我的预期输出不是在输出中添加双引号,但我得到一个带有垃圾的输出。

+---+-----+----------+----+
|eno|ename|      eloc|esal|
+---+-----+----------+----+
| 11|�abx�| �chennai�|1000|
| 22|�abr�|     �hyd�|3000|

【问题讨论】:

  • 是否可以发布准确的数据而不是图片?

标签: apache-spark pyspark apache-spark-sql


【解决方案1】:

我在 Scala 上使用 Spark 进行了尝试,它从列中删除了引号:

df = df.withColumn("ename", regexp_replace(col("ename"), "“", ""))
    .withColumn("eloc", regexp_replace(col("eloc"), "“", ""))
    .withColumn("ename", regexp_replace(col("ename"), "”", ""))
    .withColumn("eloc", regexp_replace(col("eloc"), "”", ""))

Spark 的 Python API 中肯定也有类似的东西......

【讨论】:

    【解决方案2】:

    看起来它们不是正常的双引号。您可以尝试查找哪个字符并将其转义,或者,您可以获取子字符串(如果您确信每一行都有前导和尾随引号):

    empDF.withColumn("ename", substring(col("ename"), 1, length(col("ename"))-2))
    

    【讨论】:

      【解决方案3】:

      如果您可以使用 Spark 的默认 csv 格式而不是 com.databricks.spark.csv,它应该可以正常工作

      import org.apache.spark.sql.functions._
      
      object EscapeQuotes {
        def main(args: Array[String]): Unit = {
          val spark = Constant.getSparkSess
          val pattern = "“|”"
          spark.read
            .option("header", "true")
            .option("inferSchema", "true")
            .option("quote", "\"")
            .option("escape", "\"")
            .csv("src/main/resources/sample.csv")
            .withColumn("eloc",regexp_replace(col("eloc"),pattern,""))
            .withColumn("ename",regexp_replace(col("ename"),pattern,""))
            .show()
        }
      
      }
      
      
      

      【讨论】:

      • 我已经尝试了到目前为止给出的解决方案,但对我来说没有任何效果。请问有什么替代方法吗?
      • 您好 QuickSilver,我收到语句“.option("escape", "\“")" 的“无效转义字符”问题。
      • 抱歉发错了,我会用正确的
      • 排版双引号 (“) 和 (”) 给您带来了麻烦,而不是 (")。请仔细查看并确认。以便我研究解决方案
      • 是的,你是对的。它包含 (“) 和 (”) 。现在我已经包含 (") 并尝试了,在这种情况下,我没有得到问题中提到的垃圾,但我也在输出中得到了相同的引号。有什么解决方案可以在输出数据帧中删除 (") 吗?跨度>
      猜你喜欢
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 2022-06-13
      • 2022-01-19
      • 2020-08-05
      相关资源
      最近更新 更多