直到现在我一直在做的事情是读取CSV,如下所示:
val data = env.readCsvFile[ElecNormNew](getClass.getResource("/elecNormNew.arff").getPath)
val dataSet = data map { tuple =>
val list = tuple.productIterator.toList
val numList = list map (_.asInstanceOf[Double])
LabeledVector(numList(8), DenseVector(numList.take(8).toArray))
}
ElecNorNew
是case class
的地方:
case class ElecNormNew(
var date: Double,
var day: Double,
var period: Double,
var nswprice: Double,
var nswdemand: Double,
var vicprice: Double,
var vicdemand: Double,
var transfer: Double,
var label: Double) extends Serializable {
}
如Flink's docs中所指定。但是现在我正在尝试读取包含53列的CSV。有没有办法使这个过程自动化?我需要创建一个包含53个字段的POJO吗?
在Fabian回答之后,我正在尝试以下方法:
val fieldTypes: Array[TypeInformation[_]] = Array(Types.STRING, Types.INT)
val rowIF = new RowCsvInputFormat(new Path(getClass.getResource("/lungcancer.csv").getPath), fieldTypes)
val csvData: DataSet[Row] = env.createInput[Row](rowIF)
val dataSet2 = csvData.map { tuple =>
???
}
但是不知道如何继续,我应该如何使用RowTypeInfo
?
答案 0 :(得分:2)
您可以按以下方式使用RowCsvInputFormat
:
val fieldTypes: Array[TypeInformation[_]] = Array(Types.STRING, Types.INT)
val rowIF = new RowCsvInputFormat(new Path("file:///myCsv"), fieldTypes)
val csvData: DataSet[Row] = env.createInput[Row](rowIF)
Row
将数据存储在Array[Any]
中。因此,Flink无法自动推断Row
的字段类型。这使它比键入的元组或案例类更难使用。您需要为RowTypeInfo
明确提供正确的类型。可以将其作为隐式值或通过扩展ResultTypeQueryable
接口的函数来完成。