通过在spark中使用scala加载csv文件来创建数据帧

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过在spark中使用scala加载csv文件来创建数据帧相关的知识,希望对你有一定的参考价值。

但csv文件添加了额外的双引号,导致所有列成为单列

有四列,标题和2行

"""SlNo"",""Name"",""Age"",""contact"""
"1,""Priya"",78,""Phone"""
"2,""Jhon"",20,""mail"""

val df = sqlContext.read.format("com.databricks.spark.csv").option("header","true").option("delimiter",",").option("inferSchema","true").load ("bank.csv") 
df: org.apache.spark.sql.DataFrame = ["SlNo","Name","Age","contact": string]
答案

你可以做的是使用sparkContext读取并用空替换所有"并使用zipWithIndex()分隔标题和文本数据,以便可以创建自定义模式和行rdd数据。最后,只需在sqlContext的createDataFrame api中使用行rdd和schema

//reading text file, replacing and splitting and finally zipping with index
val rdd = sc.textFile("bank.csv").map(_.replaceAll(""", "").split(",")).zipWithIndex()
//separating header to form schema
val header = rdd.filter(_._2 == 0).flatMap(_._1).collect()
val schema = StructType(header.map(StructField(_, StringType, true)))
//separating data to form row rdd
val rddData = rdd.filter(_._2 > 0).map(x => Row.fromSeq(x._1))
//creating the dataframe
sqlContext.createDataFrame(rddData, schema).show(false)

你应该得到

+----+-----+---+-------+
|SlNo|Name |Age|contact|
+----+-----+---+-------+
|1   |Priya|78 |Phone  |
|2   |Jhon |20 |mail   |
+----+-----+---+-------+

我希望答案是有帮助的

以上是关于通过在spark中使用scala加载csv文件来创建数据帧的主要内容,如果未能解决你的问题,请参考以下文章

使用 spark/scala 从 HDFS 目录中获取所有 csv 文件名

使用scala在sql表中加载csv文件

在 Scala / Spark 中通过 CSV 文件中的行有条件地映射以生成另一个 CSV 文件

将读取文件的架构存储到 spark scala 中的 csv 文件中

Spark-Scala:另存为 csv 文件(RDD)[重复]

如何使用 scala/python/spark 在 CSV 文件中创建新的时间戳(分钟)列