未知长度List转Tuple
使用背景: 在使用过
Spark抽取数据之后,按照\t分隔符将一行数据切分成list,要使用dataframe需将每行数据转成固定长度的tuple,灵活性较差,需要重复写这种模板代码.
val data = sc.textFile(input_path)
.map(line -> StringUtils.splitPreserveAllTokens(line, '\t', -1))
.map(array => {
//数据业务变动,反复需要变动的逻辑
val deviceId = array(0)
val pkg = array(1)
val feature = array(2)
(device_Id,pkg,feature)
///////////////////////
}).toDF()
希望可以实现以下方式:
val data = sc.textFile(input_path)
.map(line -> StringUtils.splitPreserveAllTokens(line, '\t', -1))
.map(array => toTuple(array.toList))
}).toDF()
以下是toTuple小工具:
def toTuple[A <: Object](list:List[A]):Product = {
val clazz = Class.forName("scala.Tuple" + list.size)
clazz.getConstructors
.apply(0)
.newInstance(list:_*)
.asInstanceOf[Product]
}
注 : 该工具只能转换长度最多为22的Tuple.