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

从没有UDF的case表达式中创建火花返回元组(结构类型)

史淳
2023-03-14

我正在寻找(一些测试没有成功)在不使用UDF的情况下从case语句返回元组结构类型,有什么方法可以做到这一点吗?

用例是:我们有两列依赖于case表达式中的相同条件,因此我们看到两个选项:

  • 写入相同条件两次,但返回不同列(不需要)
  • 写一次条件,但每次都返回2个值,这可以通过一个元组,然后我们将其拆分

我知道这可以使用UDF来完成,但是我们避免了UDF,因为被火花视为黑盒,因此它们是不可优化的,所以问题是:有没有办法让CASE语句在不使用UDFS的情况下返回多个值?

类似于:

df = df.withColumn("tuple", expr(
"CASE WHEN <condition 1> THEN (value1,value2)
      WHEN <condition 2> THEN (value3,value4)
      ELSE (value5,value6)
"))

df = df.withColumn("col1",col("tuple")[0])
df = df.withColumn("col2",col("tuple")[1])

共有1个答案

刘琨
2023-03-14

可以使用< code>array:

df = df.withColumn(
    "tuple", 
    expr("""
        CASE WHEN <condition 1> THEN array(value1,value2)
             WHEN <condition 2> THEN array(value3,value4)
             ELSE array(value5,value6)
        END
   """)
)

df = df.withColumn("col1",col("tuple")[0])
df = df.withColumn("col2",col("tuple")[1])

但请注意,数组应该都是相同的类型,即value 1value 3value 5应该具有相同的类型,并且value 2value 4value 6也应该具有相同的类型。

 类似资料:
  • 我在火花数据帧中有一个“结构类型”列,它有一个数组和一个字符串作为子字段。我想修改数组并返回相同类型的新列。我可以用UDF处理它吗?或者有什么替代方案? 似乎我需要行类型的UDF,类似 这是有意义的,因为Spark不知道返回类型的模式。不幸的是,udf.register也失败了:

  • 想象一下下面的代码: 如何定义myUdf的返回类型,以便查看代码的人立即知道它返回了一个Double?

  • 我是scala新手,尝试从元素数组中创建自定义模式,以读取基于新自定义模式的文件。 我正在从json文件中读取数组,并使用爆炸方法为列数组中的每个元素创建了一个数据框。 获得的输出为: 现在,对于上面列出的所有值,我尝试使用下面的代码动态创建val模式 上面的问题是,我能够在struct中获取数据类型,但我也希望仅为数据类型decimal获取(scale和preicion),其限制条件为max a

  • 问题内容: 输入的所有数据类型为: 我必须编写一个UDF(在pyspark中),它返回一个元组数组。我应该给它第二个参数是udf方法的返回类型吗?这将是… 问题答案: Spark中没有这样的东西。产品类型用特定类型的字段表示。例如,如果您想返回一个成对的数组(整数,字符串),则可以使用如下模式: 用法示例:

  • 如何合并数组中的所有结构并生成合并的结构? 例如,使用SparkSQL,我能够读取源json文件并生成数组类型的列,数组中的每个元素都包含一个键:值对。例如,假设我们有一个ArrayType列的值,该列的名称为,值为: 我需要将这个数组类型的列转换为结构类型,其值为{a:1,b:2,c:3}。 由于我是通过读取JSON文件获得模式的,所以我可以使用派生序号获得结果,如: 这个解决方案的问题是,如果

  • 我不断地得到错误 在终端上编译时。 在switch语句的末尾。这是在用终端编译的时候。