通过在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 / Spark 中通过 CSV 文件中的行有条件地映射以生成另一个 CSV 文件
将读取文件的架构存储到 spark scala 中的 csv 文件中