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

标签 string scala apache-spark expression scala-quasiquotes

我正在尝试将 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

代码取自 Spark 的 org.apache.spark.sql.types.StructType 伴随对象。您不能直接使用它,因为它位于私有(private)包中。此外,它使用 LegacyTypeStringParser 因此我不确定这对于生产代码是否足够好。

关于string - 将字符串表达式转换为实际工作实例表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56618536/

相关文章:

javascript - 将字符串修改为数组

scala - SKEW 连接提示的 Spark Scala 等价物

spring - 将Spring Boot应用程序jar提交到Spark-Submit

apache-spark - spark 中 worker 的 WebUI 访问

string - 用 K 对创建二进制字符串

c++ - 是否可以从 C++ 中的模板类型获取 char* 名称

java - 在 Java 中将十进制数转换为十六进制字符串失败

scala - 如何返回 Id 的序列生成

scala - 方法映射的参数太多 : (apply: (String, models.Address) => R)(unapply : R => Option[(String, models.Address)])play.api.data.Mapping[R]

scala - 如何在 Scala 中将 RDD 转换为二维数组?