如何通过Delimiter分割Spark RDD的行

时间:2015-04-20 16:36:44

标签: hadoop apache-spark apache-spark-sql mapr

我正在尝试将Spark中的数据拆分为Array[String]的RDD形式。目前我已将文件加载到String的RDD中。

> val csvFile = textFile("/input/spam.csv")

我想分成一个,分隔符。

3 个答案:

答案 0 :(得分:2)

此:

val csvFile = textFile("/input/spam.csv").map(line => line.split(","))

返回RDD[Array[String]]

如果您需要第一列为RDD,则使用map函数仅返回Array中的第一个索引:

  val firstCol = csvFile.map(_.(0))

答案 1 :(得分:0)

您应该使用spark-csv库,它能够解析您的文件并考虑标题,并允许您指定分隔符。此外,它在推断架构方面做得相当不错。我将让您阅读文档以发现大量options随时可用。

这可能如下所示:

sqlContext.read.format("com.databricks.spark.csv")
.option("header","true")
.option("delimiter","your delimitor")
.load(pathToFile)

请注意,这会返回一个您可能需要使用.rdd函数转换为rdd的DataFrame。

当然,您必须将软件包加载到驱动程序中才能工作。

答案 2 :(得分:0)

// create spark session
val spark = org.apache.spark.sql.SparkSession.builder
        .master("local")
        .appName("Spark CSV Reader")
        .getOrCreate;

// read csv
val df = spark.read
         .format("csv")
         .option("header", "true") //reading the headers
         .option("mode", "DROPMALFORMED")
         .option("delimiter", ",")
         .load("/your/csv/dir/simplecsv.csv")

// convert dataframe to rdd[row]
val rddRow = df.rdd
// print 2 rows
rddRow.take(2)

// convert df to rdd[string] for specific column
val oneColumn = df.select("colName").as[(String)].rdd
oneColumn.take(2)

// convert df to rdd[string] for multiple columns
val multiColumn = df.select("col1Name","col2Name").as[(String, String)].rdd
multiColumn.take(2)