我有一个包含大约270列的巨大数据库导入表,我创建了一个JavaRDD并用它来填充数据帧。
场景:如果CSV文件中的所有字段都存在,那么一切都很棒。但是如果CSV中有一些空字段,例如。
Value1,,,,,,value7,,,,,
然后,由于Indexoutofbound异常(列>行大小),在写入hive表存储的镶木地板时失败。我不想使用spark-csv
库。
我尝试使用过滤器,但没有用,因为我需要所有列,即使CSV中没有数据也是如此。如果我遗失某些事情,请告诉我。
JavaRDD<String> tLogRDD =jsc.textFile(dataFile);
String schema=tLogRDD.first();
List<StructField> columns =new ArrayList<StructField>();
for(String fieldName: schema.split(","))
{
columns.add(DataTypes.createStructField(fieldName,DataTypes.StringType,false));
}
StructType schemaStructType = DataTypes.createStructType(columns);
System.out.println("XXXXXXXXXXXX-Row Read Start-XXXXXXXXXXXXXXX");
@SuppressWarnings("serial")
JavaRDD<Row> rowRDD = tLogRDD.map(
new Function<String, Row>() {
@Override
public Row call(String record) throws Exception {
String[] fields = record.split(",");
Object[] fields_converted = fields;
return RowFactory.create(fields_converted);
}
});
//apply schema to rows
DataFrame tLogfDataFrame=hContext.createDataFrame(rowRDD, schemaStructType);
System.out.println("DataFrame Constructed Successfully");
tLogfDataFrame.show(10);
tLogfDataFrame.save("C:/Users/Documents/1001.csv","parquet");
答案 0 :(得分:0)
您可以使用Spark的csv阅读器, 喜欢:
sparkSession.read()
.format("csv")
.option("header","true")
.option("inferSchema","true")
.load(--file path--)
这更容易,并且具有一组选项。