我有一个.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)
谁能告诉我如何进行这种转换?非常感谢。
答案 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