Scala小工具集

591 阅读1分钟

未知长度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.