Spark:将CSV转换为RDD [Row]

时间:2017-07-24 08:31:20

标签: scala apache-spark apache-spark-sql rdd

我有一个.csv文件,其中包含以下结构中的258列。

["label", "index_1", "index_2", ... , "index_257"]

现在我想把这个.csv文件转换为RDD [Row]:

val data_csv = sc.textFile("~/test.csv")

val rowRDD = data_csv.map(_.split(",")).map(p => Row( p(0), p(1).trim, p(2).trim)) 

如果我以这种方式进行转换,我必须专门写下258列。所以我试过了:

val rowRDD = data_csv.map(_.split(",")).map(p => Row( _ => p(_).trim)) 

val rowRDD = data_csv.map(_.split(",")).map(p => Row( x => p(x).trim))

但这两个也不起作用并报告错误:

error: missing parameter type for expanded function ((x$2) => p(x$2).trim)

谁能告诉我如何进行这种转换?非常感谢。

3 个答案:

答案 0 :(得分:2)

您应该使用sqlContext代替sparkContext作为

val df = sqlContext.read
  .format("com.databricks.spark.csv")
  .option("header", true)
  .load(("~/test.csv")

这将创建dataframe。在.rdd上调用df会给您RDD[Row]

val rdd = df.rdd

答案 1 :(得分:1)

而是作为textFile阅读,使用spark-csv

读取CSV文件

在你的情况下

val df = sqlContext.read
    .format("com.databricks.spark.csv")
    .option("header", "true") // Use first line of all files as header
    .option("inferSchema", "true") // Automatically infer data types
    .option("quote", "\"")  //escape the quotes 
    .option("ignoreLeadingWhiteSpace", true)  // escape space before your data
    .load("cars.csv")

这会将数据作为数据框加载,现在您可以轻松将其更改为RDD。

希望这有帮助!

答案 2 :(得分:1)

除了其他正确答案外,正确执行您尝试做的事情的方法是在地图功能中使用function loadControllersFromWorkspace(testCase) factory = App.TransferFunctionFactory(); evalin('base', 'w1 = tf(1 + ''s'')'); evalin('base', 'w2 = tf(3 / ''s'')'); evalin('base', 'w3 = 4.3'); evalin('base', 'w4 = tf(1 / (''s'' + 1))'); %who collection = factory.fromWorkspace(); testCase.verifyGreaterThanOrEqual(collection.getSize(), 3); end

Row.fromSeq

这会将您的val rdd = sc.parallelize(Array((1 to 258).toArray, (1 to 258).toArray) ) .map(Row.fromSeq(_)) 变为rdd

Row