[英]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.