当前位置: 首页 > 知识库问答 >
问题:

火花:向csv文件添加列名失败

阮选
2023-03-14
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))

这里怎么了?

共有1个答案

仰翰采
2023-03-14

正如@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”的列作为第一列。 我使用的进出口商品如下: 但上述情况并没有如预期的那样起作用。它正在替换列数据。

  • 我试图从获取列,并将其转换为。