将字符串表达式转换为实际的工作实例表达式

高清晰度

我正在尝试将Scala中的表达式转换为工作代码,该表达式将作为String保存在数据库中。

我已经尝试过Reflect Toolbox,Groovy等。但是我似乎无法实现我所需要的。

这是我尝试过的:


import scala.reflect.runtime.universe._
import scala.reflect.runtime.currentMirror
import scala.tools.reflect.ToolBox

val toolbox = currentMirror.mkToolBox()
val code1 = q"""StructType(StructField(id,IntegerType,true), StructField(name,StringType,true), StructField(tstamp,TimestampType,true), StructField(date,DateType,true))"""
val sType = toolbox.compile(code1)().asInstanceOf[StructType]

我需要使用sType实例将customSchema传递到csv文件以创建数据帧,但它似乎失败了。

有什么办法可以使StructType的字符串表达式转换为实际的StructType实例?任何帮助,将不胜感激。

卢卡斯蒂莫

如果StructType来自Spark,并且您只想将String转换为StructType,则不需要反射。您可以尝试以下方法:

import org.apache.spark.sql.catalyst.parser.LegacyTypeStringParser
import org.apache.spark.sql.types.{DataType, StructType}

import scala.util.Try

def fromString(raw: String): StructType =
  Try(DataType.fromJson(raw)).getOrElse(LegacyTypeStringParser.parse(raw)) match {
    case t: StructType => t
    case _             => throw new RuntimeException(s"Failed parsing: $raw")
  }

val code1 =
  """StructType(Array(StructField(id,IntegerType,true), StructField(name,StringType,true), StructField(tstamp,TimestampType,true), StructField(date,DateType,true)))"""
fromString(code1) // res0: org.apache.spark.sql.types.StructType

该代码取自org.apache.spark.sql.types.StructTypeSpark伴随对象。您不能直接使用它,因为它在私人包装中。而且,它使用了,LegacyTypeStringParser所以我不确定这对于生产代码是否足够好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章