繁体   English   中英

Spark:将列名添加到CSV文件失败

[英]Spark: adding column name to csv file fails

我有csv格式的“ a.txt”,由制表符分隔:

16777216    16777471        -33.4940    143.2104
16777472    16778239    Fuzhou  26.0614 119.3061

然后我运行:

sc.textFile("path/to/a.txt").map(line => line.split("\t")).toDF("startIP", "endIP", "City", "Longitude", "Latitude")

我得到了:

java.lang.IllegalArgumentException:要求失败:列数不匹配。 旧列名称(1):值新列名称(5):scala.start。$ def.require(Predef.scala:224)处的startIP,endIP,City,Longitude,纬度(org.apache.spark.sql.DatasetHolder.toDF(DatasetHolder.scala:40)的(Dataset.scala:376)... 47消失

如果我只是跑步:

res.map(line => line.split("\t")).take(2)

我有:

rdd: Array[Array[String]] = Array(Array(16777216, 16777471, "", -33.4940, 143.2104), Array(16777472, 16778239, Fuzhou, 26.0614, 119.3061))

怎么了

正如@ user7881163所指出的,发生错误是因为您的split产生了一个单列,其值(因此,Spark给出的value名称)是split生成的令牌数组。

然而,每从@ zero323评论,只是确保你使用的版本collect @ user7881163用途(就是那个需要的部分功能),如果您是在规模经营,因为其他的,更常用的collect将您所有的数据移动到驱动程序并淹没了这台机器。 而且,如果您没有大规模运营,为什么还要使用Spark?

这是一种略有不同的方法,也允许丢失城市数据:

sc.textFile("path/to/a.txt")
  .map(_.split("\t"))
  .map {
      case Array(startIP, endIP, city, longitude, latitude) => (startIP, endIP, Some(city), longitude, latitude)
      case Array(startIP, endIP, longitude, latitude) => (startIP, endIP, None, longitude, latitude)
  }.toDF("startIP", "endIP", "City", "Longitude", "Latitude")

尝试:

sc
  .textFile("path/to/a.txt")
  .map(line => line.split("\t"))
  .collect { case Array(startIP, endIP, City, Longitude, Latitude) => 
    (startIP, endIP, City, Longitude, Latitude) 
  }.toDF("startIP", "endIP", "City", "Longitude", "Latitude")

或仅使用csv源:

spark.read.option("delimiter", "\t").csv("path/to/a.txt")

您当前的代码使用单列array<string>类型创建一个DataFrame 这就是为什么您传递5个名称时失败的原因。

您可以尝试以下示例:

dataDF = sc.textFile("filepath").map(x=>x.split('\t').toDF();

data = dataDF.selectExpr("_1 as startIP", "_2 as endIP", "_3 as City", "_4 as Longitude", "_5 as Latitude");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM