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")
然后我得到:
IllegalArgumentException:需求失败:列数不匹配。旧列名(1):值新列名(5):startIP,endIP,City,Longitude,Latitude at scala.predef$.require(predef.scala:224)at org.apache.spark.sql.dataset.todf(dataset.scala:376)at org.apache.spark.sql.datasetholder.todf(datasetholder.scala:40)...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")
我有几个CSV文件如下所示: 我想添加一个新的列到所有的CSV文件,使它看起来像这样: 到目前为止,我的剧本是: (Python 3.2) 但在输出中,脚本跳过每一行,新列中只有Berry:
我想在spark中读取一个CSV,将其转换为DataFrame,并使用将其存储在HDFS中 在Apache Spark中将CSV文件加载为DataFrame的正确命令是什么?
我试图将大量平面文件加载到一个sql表中,并向表中添加一个filename列。 在控制流中,我有两个foreech循环,抓取文件名并将它们传递给两个变量。
我有麻烦重命名基于csv的数据帧的标头。 我得到了以下数据帧:df1: 现在我想根据csv文件更改列名(第一行),如下所示: 因此,我期望数据帧如下所示: 有什么想法吗?感谢您的帮助:)
我有一个文件,其中包含以下数据: 我正在尝试插入一个名为“Date”的列作为第一列。 我使用的进出口商品如下: 但上述情况并没有如预期的那样起作用。它正在替换列数据。
我试图从获取列,并将其转换为。