当前位置: 首页 > 知识库问答 >
问题:

SQL DSL的spark寄存器表达式

钱安和
2023-03-14

我如何访问一个催化剂表达式(不是常规UDF)在火花SQLscala DSL API?

http://geospark.datasyslab.org仅允许基于文本的执行

GeoSparkSQLRegistrator.registerAll(sparkSession)
var stringDf = sparkSession.sql(
  """
    |SELECT ST_SaveAsWKT(countyshape)
    |FROM polygondf
  """.stripMargin)

当我尝试使用SQL scala DSL时。withColumn(“foo”,ST\u Point(col(“x”),col(“y”)))我得到一个类型不匹配的错误,column get ST\u Point是预期的。

我需要更改什么才能正确注册催化剂表达式作为可直接通过scalaSQLDSL API调用的东西?

催化剂表达式都通过https://github.com/DataSystemsLab/GeoSpark/blob/fadccf2579e4bbe905b2c28d5d1162fdd72aa99c/sql/src/main/scala/org/datasyslab/geosparksql/UDF/UdfRegistrator.scala#L38注册:

Catalog.expressions.foreach(f=>sparkSession.sessionState.functionRegistry.createOrReplaceTempFunction(f.getClass.getSimpleName.dropRight(1),f))
import org.apache.spark.sql.geosparksql.expressions.ST_Point
val  myPoint = udf((x: Double, y:Double) => ST_Point _)

失败原因:

_ must follow method; cannot follow org.apache.spark.sql.geosparksql.expressions.ST_Point.type

共有2个答案

华修永
2023-03-14

这里是另一个可以用来调用UDF的方法,以及我到目前为止所做的工作。

      .withColumn("locationPoint", callUDF("ST_Point", col("longitude"),
        col("latitude")))
龚博涛
2023-03-14

您可以访问组织中未公开的表达式。阿帕奇。火花sql。使用expr方法的函数包。它实际上并没有在Scala中提供类似UDF的对象,但它确实允许您使用Dataset API编写查询的其余部分。

以下是文档中的一个示例:

// get the number of words of each length
df.groupBy(expr("length(word)")).count()
 类似资料:
  • 强制kryo序列化时失败,即使用以下配置启动火花时失败: 由于未注册RTreeNode类。到目前为止,一切顺利。 问题出现时尝试:-使用但不强制kryo:火花卡住/不继续操作-尝试注册类: 可通过以下方式固定: 但是, 编译失败,因为当尝试在命名空间中创建自定义kryo注册器以访问私有类时,我无法注册要触发的通用。 如何在不指定具体实现的情况下注册泛型类,或者在返回java序列化时防止spark陷

  • 寄存器模式 寄存器模式是ILRuntime2.0版引入的专用于优化大规模数值计算的执行模式。该模式通过ILRuntime自己的JIT Compiler将原始DLL的MSIL指令集转换成一个自定义的基于寄存器的指令集,再进行解译执行。由于该JIT编译的结果是ILRuntime自己设计的虚拟指令集,并不是真实硬件指令集,因此可以毫无问题的在iOS等平台上执行 使用方法 开启寄存器模式,主要有2个途径:

  • Vim提供了许多寄存器。可以将这些寄存器用作多个剪贴板。使用多个文件时,此功能非常有用。在本章中,将讨论以下主题内容 - 复制寄存器中的文本 粘贴寄存器中的文本 列出可用的寄存器 寄存器类型 1. 复制寄存器中的文本 对于复制,可以使用普通的命令,即并将其存储在寄存器中,可以使用以下语法 - 例如,要复制寄存器中的文本,请使用以下命令 - 2. 粘贴寄存器中的文本 从寄存器粘贴文本 - 例如,下面

  • 当前的Perl 5虚拟机是一台堆栈机器。 它通过将操作保持在堆栈上来传递操作之间的值。 操作将值加载到堆栈上,执行他们需要执行的操作并将结果放回堆栈。 这很容易使用,但速度很慢。 要将两个数字相加,您需要执行三次堆栈推送和两次堆栈弹出。 更糟糕的是,堆栈必须在运行时增长,这意味着在您不想分配内存时分配内存。 因此,Parrot将打破虚拟机的既定传统,并使用寄存器架构,更类似于真实硬件CPU的架构。

  • 处理器操作主要涉及处理数据。 该数据可以存储在存储器中并从其上访问。 然而,从存储器读取数据和将数据存储到存储器中会降低处理器的速度,因为它涉及通过控制总线向存储器存储单元发送数据请求并通过相同通道获取数据的复杂过程。 为了加速处理器操作,处理器包括一些内部存储器存储位置,称为registers 。 寄存器存储数据元素以便处理而无需访问存储器。 处理器芯片内置有限数量的寄存器。 处理器寄存器 IA

  • 80386中应用程序员感兴趣的有16个寄存器。如图2-5所示,这些寄存器被分成以下几个基本类型: 1.通用寄存器。这些32为通用寄存器主要用来数学和逻辑运算。 2.段寄存器。这些特殊目的寄存器允许系统软件设计者选择平坦模式或是段模式。这六个寄存器决定了,任何时候,哪段存储器可以被寻址。 3.状态和指令寄存器。这些特殊目的寄存器用于记录和改变80386处理器状态的一些特征。 2.3.1 通用寄存器