string - 将字符串表达式转换为实际工作实例表达式
问题描述
我正在尝试将 Scala 中作为字符串保存在数据库中的表达式转换回工作代码。
我尝试过 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.StructType
Spark 的伴随对象。您不能直接使用它,因为它在私有包中。此外,它使用LegacyTypeStringParser
所以我不确定这是否足以用于生产代码。
推荐阅读
- ruby - 当从子调用父方法时,从父调用子方法
- powershell - 使用 powershell 将 Microsoft 表单 webpart 配置到现代页面
- python - 如何配置 IPython 以与普通 Python REPL 相同的方式执行单元块?
- c - Essential C 中的 Swap() func 无法编译
- java - Spring Boot - application.properties 中的程序参数
- webcam - 如何使用分段输出文件在 DirectShow 中预览和捕获?
- networking - 如何确定 sctp 包中的块数?
- asp.net-mvc - 在 DataModel 中添加新表时 LINQ to Entities 查询
- maven - cli 的 GAE 成功,Cloud Build 的失败。错误:未找到
- c# - Xamarin Intent 空指针