【问题标题】:creating dataframe by loading csv file using scala in spark通过在 spark 中使用 scala 加载 csv 文件来创建数据框
【发布时间】:2018-08-13 19:44:39
【问题描述】:

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

有四列,标题和两行

"""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]

【问题讨论】:

  • 请看this论坛帖子,上面说分隔符只能是单个字符长。因此,要么您需要自己指定架构,要么将其读取为 RDD 并清理记录并将其转换为 DataFrame。

标签: scala csv apache-spark dataframe apache-spark-sql


【解决方案1】:

您可以做的是使用sparkContext 读取它并将所有 " 替换为empty 并使用zipWithIndex() 分隔标题和文本数据,以便 custom schema 和 row rdd 数据。最后只需在 sqlContext 的 createDataFrame api 中使用 row rddschema

//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   |
+----+-----+---+-------+

希望回答对你有帮助

【讨论】:

  • 您需要将 Row 导入为import org.apache.spark.sql.Row
  • 第二行是过滤文本文件的第一行数组。第 3 行是从我们从第二行代码获得的线阵列为数据框创建模式,第 4 行代码是将数据线阵列转换为要转换为数据框的行。我已经评论了解释:)
  • 真的谢谢你..我成功输出了。你能推荐任何sparksql和scala的网站或教科书吗......我需要学习深入的编码
  • 如果答案有帮助,那么您应该考虑接受它。关于学习 sparksql,你可以通过官方 spark 网站和我自己学习的 scala。 :)
  • 先生在第 3 行,如果我想指定不同数据类型的列,所有列都被视为字符串类型......它不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2021-09-29
  • 2020-07-14
相关资源
最近更新 更多