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

如何解析CSV字符串到火花数据帧使用scala?

孙渝
2023-03-14

我想将包含字符串记录的RDD转换为Spark数据帧,如下所示。

"Mike,2222-003330,NY,34"
"Kate,3333-544444,LA,32"
"Abby,4444-234324,MA,56"
....

模式行不在同一个RDD中,而是在另一个变量中:

val header = "name,account,state,age"

所以现在我的问题是,我如何使用上面两个,在Spark中创建一个数据帧?我使用的是Spark 2.2版。

我确实搜索并看到了一篇帖子:我可以使用spack-csv将表示为字符串的CSV读取到Apache Spark中吗?然而,这并不是我所需要的,我也无法找到一种方法来修改这段代码以在我的情况下工作。

非常感谢你的帮助。

共有1个答案

金慈
2023-03-14

更简单的方法可能是从CSV文件开始,直接将其作为数据帧读取(通过指定模式)。您可以在这里看到一个示例:在将csv文件作为数据帧读取时提供模式。

当数据已经存在于RDD中时,您可以使用toDF()转换为数据帧。此函数还接受列名作为输入。要使用此功能,请首先使用Spark会话对象导入火花隐含:

val spark: SparkSession = SparkSession.builder.getOrCreate()
import spark.implicits._

由于RDD包含字符串,因此需要首先将其转换为表示数据帧中列的元组。在这种情况下,这将是一个RDD[(String, String, String, Int)],因为有四个列(最后一个age列更改为int以说明如何完成)。

假设输入数据位于rdd中:

val header = "name,account,state,age"

val df = rdd.map(row => row.split(","))
  .map{ case Array(name, account, state, age) => (name, account, state, age.toInt)}
  .toDF(header.split(","):_*)

结果数据帧:

+----+-----------+-----+---+
|name|    account|state|age|
+----+-----------+-----+---+
|Mike|2222-003330|   NY| 34|
|Kate|3333-544444|   LA| 32|
|Abby|4444-234324|   MA| 56|
+----+-----------+-----+---+
 类似资料:
  • 如何使用Spark-Scala连接日期和时间列(两个字符串)

  • 在PySpark中或者至少在Scala中,Apache Spark中是否有与Pandas Melt函数等价的函数? 到目前为止,我一直在用Python运行一个示例数据集,现在我想对整个数据集使用Spark。

  • 我想在spark中读取一个CSV,将其转换为DataFrame,并使用将其存储在HDFS中 在Apache Spark中将CSV文件加载为DataFrame的正确命令是什么?

  • 我正在尝试使用Databricks的spark-csv2.10依赖关系将一个数据帧写入到HDFS的*.csv文件。依赖关系似乎可以正常工作,因为我可以将.csv文件读入数据帧。但是当我执行写操作时,我会得到以下错误。将头写入文件后会出现异常。 当我将查询更改为时,write工作很好。 有谁能帮我一下吗? 编辑:根据Chandan的请求,这里是的结果

  • 类似的问题,但没有足够的观点来评论。 根据最新的Spark文档,< code>udf有两种不同的用法,一种用于SQL,另一种用于DataFrame。我找到了许多关于如何在sql中使用< code>udf的例子,但是还没有找到任何关于如何在数据帧中直接使用< code>udf的例子。 o.p.针对上述问题提供的解决方案使用,这是,将根据Spark Java API文档在Spark 2.0中删除。在那

  • 问题内容: 我有以下类型的字符串 我想将字符串拆分为每个逗号的数组,但仅将单引号之外的逗号分隔。 我想不出正确的正则表达式进行拆分… 会给我 但结果应该是: 有什么跨浏览器解决方案? 问题答案: 免责声明 以下答案仅适用于一种非常特定的CSV格式。正如DG在评论中正确指出的那样,此解决方案不适合RFC 4180定义的CSV,也不适合MSExcel格式。此解决方案仅演示了如何解析一个(非标准)CSV