Spark将列转换为存储在字符串中的sql类型

2024-01-23

简单的请求是我需要帮助将列添加到数据帧,但是该列必须为空,其类型来自 ...spark.sql.types 并且必须从字符串定义类型。

我可能可以用 ifs 或 case 来做到这一点,但我正在寻找更优雅的东西。不需要为 org.apache.spark.sql.types 中的每种类型编写案例

例如,如果我这样做:

df = df.withColumn("col_name", lit(null).cast(org.apache.spark.sql.types.StringType))

它按预期工作,但我将类型存储为字符串,

var the_type = "StringType"

或者 var the_type = "org.apache.spark.sql.types.StringType"

我无法通过从字符串定义类型来使其工作。

对于那些感兴趣的人,这里有一些更多细节:我有一个包含元组(col_name,col_type)作为字符串的集合,我需要添加具有正确类型的列,以便将来在两个数据帧之间进行联合。

我目前有这个:

for (i <- set_of_col_type_tuples) yield {
    val tip = Class.forName("org.apache.spark.sql.types."+i._2)
    df = df.withColumn(i._1, lit(null).cast(the_type))
    df }

if I use

val the_type = Class.forName("org.apache.spark.sql.types."+i._2)

I get

error: overloaded method value cast with alternatives:   (to: String)org.apache.spark.sql.Column <and>   (to: org.apache.spark.sql.types.DataType)org.apache.spark.sql.Column  cannot be applied to (Class[?0])

if I use

val the_type = Class.forName("org.apache.spark.sql.types."+i._2).getName()

这是一个字符串,所以我得到:

org.apache.spark.sql.catalyst.parser.ParseException: mismatched input '.' expecting {<EOF>, '('}(line 1, pos 3)
== SQL == org.apache.spark.sql.types.StringType
---^^^

编辑:所以,为了清楚起见,该集合包含这样的元组 ("col1","IntegerType"), ("col2","StringType") 而不是 ("col1","int"), ("col2", “细绳”)。简单的转换(i._2)不起作用。

谢谢。


您可以使用重载方法cast,它有一个 String 作为参数:

val stringType : String = ...
column.cast(stringType)

def 强制转换(至:字符串):列

使用规范字符串将列转换为不同的数据类型 类型的表示。

您还可以扫描所有数据类型:

val types = classOf[DataTypes]
    .getDeclaredFields()
    .filter(f => java.lang.reflect.Modifier.isStatic(f.getModifiers()))
    .map(f => f.get(new DataTypes()).asInstanceOf[DataType])

现在类型是Array[DataType]。您可以将其翻译为地图:

val typeMap = types.map(t => (t.getClass.getSimpleName.replace("$", ""), t)).toMap

并在代码中使用:

column.cast(typeMap(yourType))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark将列转换为存储在字符串中的sql类型 的相关文章

随机推荐

  • 在开源项目中包含 Highcharts [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想包括高图表 http www highcharts com 开源项目中的库 scala笔记本 https github com Ole
  • 如何将多个 *.zip 存档文件解压缩到单独的文件夹中?

    我用 Google 搜索 但没有找到适用于 Windows 的内容 如何将多个文件提取到多个文件夹中 例如 a zip b zip and c zip进入文件夹a b and c 我正在寻找命令提示符命令或批处理文件解决方案 Thanks
  • 我可以在界面生成器中为 NSTextField 的文本添加下划线吗?

    我可以在界面生成器中为 NSTextField 的文本添加下划线吗 到目前为止 我只能改变它的颜色 有没有办法加下划线 thanks 仅适用于 iOS 是的 设置属性文本 然后选择文本 单击鼠标右键 gt 字体 gt 下划线
  • 如何将两个过程合二为一?

    只是想知道是否有一种语法快捷方式可以获取两个过程并将它们连接起来 以便将一个过程的输出传递给另一个过程 相当于 a gt x x 1 b gt x x 10 c gt x b a x 当处理诸如此类的事情时 这会派上用场method abc
  • mysql tinyint(2) 与学说的布尔值映射不正确

    我使用 symfony2 和命令对数据库进行了逆向工程 php app console doctrine mapping convert php app console doctrine mapping import php app con
  • Android:setContentView() == getViewInflate().inflate()?

    我尽我最大的努力想出一种巧妙的方法来清理成堆的东西Blah blah Blah this findViewById R id blah 否则会污染我的小 Activity 的字段和 onCreate 方法 为此 我觉得我不应该对 XML 中
  • 当模块同名时导入 python 包

    我有一个模块blah time我在正常时间和日期操作周围进行一些健全性检查和包装函数 import time def sleep n time sleep n 当我打电话时sleep 它只会抛出最大递归错误 我猜命名空间是错误的 所以我尝试
  • HAVING 子句后面可以有 WHERE 子句吗?

    是否可以在 HAVING 子句后使用 WHERE 子句 我首先想到的是子查询 但我不确定 附 如果答案是肯定的 您能举一些例子吗 不 不在同一个查询中 The where子句位于having和group by 如果您想在分组之前过滤掉记录
  • 如何添加窗口消息事件监听器-Android WebView

    如何添加事件监听器来处理window message事件在一个WebView 我试过这个 webView evaluateJavascript window addEventListener message function e Andro
  • 如何获取 jinja2 模板中所有变量的列表

    我正在尝试获取模板中所有变量和块的列表 我不想创建自己的解析器来查找变量 我尝试使用以下代码片段 from jinja2 import Environment PackageLoader env Environment loader Pac
  • 我应该开发什么最低的 BlackBerry 操作系统?

    我正在为 BlackBerry 移动设备开发 Netflix 应用程序 我需要决定我应该开发的最低操作系统版本 取决于我选择的版本会产生一些设计影响 例如我可以使用哪些浏览器字段类等 归根结底是 我应该支持低于 OS 5 0 的版本吗 我会
  • 如何确定我使用哪个 GC?

    我没有指定任何GC 我认为我的JVM默认没有启用任何GC 当然我知道OpenJDK8默认使用ParallelGC 但我认为它应该可以通过命令行打印 如下所示 java XX PrintFlagsFinal grep Use grep GC
  • GCC循环展开标志真的有效吗?

    在C中 我有一个任务 我必须用以下方法进行乘法 反转 转置 加法等 huge矩阵分配为二维数组 数组的数组 我找到了 gcc 标志 funroll all loops 如果我理解正确 这将自动展开所有循环 而无需程序员做任何努力 我的问题
  • jQuery - 单击链接时将光标置于输入字段中

    我想在单击特定链接后将光标放在输入字段中 我将其用于小型搜索引擎 想象一个输入字段 然后一些链接在输入字段中添加一个字符串 例如 丹麦 英格兰等 现在我需要将光标放置在这样的位置 丹麦 此处 这可能吗 更新 我现在正在使用此代码来替换文本
  • 如何在应用程序运行之间本地检测用户的 iPhone 时钟进度?

    休闲游戏中的一个常见漏洞是人为地提前系统时钟以在游戏中向前跳跃 iOS 设备上的应用程序如何检测此类用户时钟提前 不得涉及网络通信 当时钟提前时 不得假设应用程序已打开 运行或暂停 必须检测时钟前进 仅检测时钟回滚是不够的 理想情况下 该解
  • 有没有办法在 Nuxt.js 中使用 sass 而不是 node-sass (sass-loader 的默认值)?

    我正在尝试在 Nuxt js 中使用 sass 包而不是 node sass 我找到了这样的配置 vue config js module exports css loaderOptions sass implementation requ
  • getUserMedia() 权限被拒绝

    我正在尝试使用测试屏幕共享getUserMedia 我有 Chrome 版本 28 和getUserMedia 屏幕捕获标志已启用 但我仍然收到权限被拒绝的错误 On this 屏幕截图演示 http simpl info screenca
  • 如何以声明方式将禁用/选中等伪布尔属性绑定到布尔值?

    有没有一种简单的方法来绑定属性 例如disabled or checked真 假属性 就像是
  • JavaScript(初级)Kata - 使用函数构建计算器

    我正在解决以下类型 编写一个程序 将 sum product mean 或 sqrt 中的一个作为第一个参数 并使用一系列数字作为进一步的参数 该程序将适当的函数应用于该系列 我已经解决了它 下面的代码 但它体积庞大且效率低下 我想重写它
  • Spark将列转换为存储在字符串中的sql类型

    简单的请求是我需要帮助将列添加到数据帧 但是该列必须为空 其类型来自 spark sql types 并且必须从字符串定义类型 我可能可以用 ifs 或 case 来做到这一点 但我正在寻找更优雅的东西 不需要为 org apache sp