【问题标题】:Working with duplicated columns in SparkR在 SparkR 中处理重复的列
【发布时间】:2016-03-08 09:17:51
【问题描述】:

我正在解决一个问题,我需要加载大量 CSV 并使用 SparkR 对它们进行一些聚合。

  • 我需要尽可能地推断架构(因此检测整数等)。
  • 我需要假设我无法对架构进行硬编码(未知数量的 每个文件中的列或无法仅从列名推断架构)。
  • 我无法从具有重复标头值的 CSV 文件推断架构 - 它根本不允许您这样做。

我像这样加载它们:

df1 <- read.df(sqlContext, file, "com.databricks.spark.csv", header = "true", delimiter = ",")

加载正常,但是当我尝试运行任何类型的作业(甚至是简单的count())时,它会失败:

  java.lang.IllegalArgumentException: The header contains a duplicate entry: # etc

我尝试重命名架构中的标题:

new <- make.unique(c(names(df1)), sep = "_")
names(df1) <- new
schema(df1) # new column names present in schema

但是当我再次尝试 count() 时,我得到了与以前相同的重复错误,这表明它引用了旧的列名。

我觉得有一个非常简单的方法,如果有,请提前道歉。有什么建议吗?

【问题讨论】:

  • 您可能会遇到与以前相同的重复错误,因为在您的 .count() 之前没有发生任何操作,因此在此之前数据甚至没有加载到您的数据框中,即使您更改了架构。您可以选择从 csv 中删除标题行,还是将其注释掉? (您可以将 csv 阅读器设置为忽略注释行)。然后在读取文件时使用 inferSchema="true"。

标签: sparkr


【解决方案1】:

spark csv 包目前似乎没有办法按索引跳过行,如果你不使用 header="true",你的带有欺骗的标题将成为第一行,这会弄乱你的模式推断。如果您碰巧知道带有欺骗的标题以哪个字符开头,并且知道没有其他行将以该字符开头,则可以将其放入注释字符设置中,该行将被跳过。例如。

df <- read.df(sqlContext, "cars.csv", "com.databricks.spark.csv",header="false", comment="y",delimiter=",",nullValue="NA",mode="DROPMALFORMED",inferSchema="true"‌​) 

【讨论】:

  • 这是我试图避免的。我正在尝试创建一个尽可能不依赖于对文件进行更改的解决方案,但没有按索引跳过行的选项,这似乎很困难。
  • 可能要考虑分叉 spark-csv 库并在 CsvRelation.scala 中编写一个不使用标题但跳过标题行的方法? github.com/databricks/spark-csv
猜你喜欢
  • 2016-12-31
  • 2015-10-14
  • 2020-02-06
  • 2016-08-26
  • 2016-12-15
  • 1970-01-01
  • 2021-04-03
  • 2017-11-23
  • 2019-06-08
相关资源
最近更新 更多