如何使用Sparkcontext读取带引号的CSV

时间:2018-12-24 15:48:15

标签: scala csv apache-spark spark-graphx

我最近开始使用scala spark,尤其是我正在尝试使用GraphX以便从csv生成图形。要读取带有Spark上下文的csv文件,我总是这样做:

val rdd = sc.textFile("file/path")
   .map(line => line.split(","))

通过这种方式,我获得了对象Array [String]的RDD。 我的问题是csv文件包含用引号(“”)和不带引号的数字分隔的字符串,文件中某些行的示例如下:

"Luke",32,"Rome"
"Mary",43,"London"
"Mario",33,"Berlin"   

如果使用方法split(“,”),我将获得包含引号的String对象,例如,字符串Luke被保存为“ Luke”而不是Luke。 如何不考虑引号并制作正确的字符串对象? 我希望我能清楚地解释我的问题

2 个答案:

答案 0 :(得分:0)

您可以让Spark DataFrame级CSV解析器为您解决该问题

val rdd=spark.read.csv("file/path").rdd.map(_.mkString(",")).map(_.split(","))

顺便说一句,您可以根据“行”字段在第一个地图中将“行”直接转换为VertexId((字符串,字符串))

答案 1 :(得分:0)

尝试以下示例。

import org.apache.spark.sql.SparkSession
object DataFrameFromCSVFile {

  def main(args:Array[String]):Unit= {

    val spark: SparkSession = SparkSession.builder()
      .master("local[1]")
      .appName("SparkByExample")
      .getOrCreate()

    val filePath="C://zipcodes.csv"

    //Chaining multiple options
    val df2 = spark.read.options(Map("inferSchema"->"true","sep"->",","header"->"true")).csv(filePath)
    df2.show(false)
    df2.printSchema()

  }
}