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

动态查询复杂类型的spark sql数据帧

沙靖琪
2023-03-14

我试图用复杂类型查询spark sql数据帧,其中函数本身应该能够创建和表达式来为嵌套的复杂数据类型生成列数据帧。说

case class SubRecord(x: Int)
case class ArrayElement(foo: String, bar: Int, vals: Array[Double])
case class Record(
  an_array: Array[Int], a_map: Map[String, String], 
  a_struct: SubRecord, an_array_of_structs: Array[ArrayElement])

val df = sc.parallelize(Seq(
  Record(Array(1, 2, 3), Map("foo" -> "bar"), SubRecord(1),
         Array(
           ArrayElement("foo", 1, Array(1.0, 2.0)),
           ArrayElement("bar", 2, Array(3.0, 4.0)))),
  Record(Array(4, 5, 6), Map("foz" -> "baz"), SubRecord(2),
         Array(ArrayElement("foz", 3, Array(5.0, 6.0)), 
               ArrayElement("baz", 4, Array(7.0, 8.0))))
)).toDF

引用自查询SparkSQL具有复杂类型的DataFrame

用于提取地图类型查询可以是

df.select($"a_map.foo").show

现在如果我有

case class Record(
  an_array: Array[Int], a_map_new: Map[String, Array[ArrayElement]], 
  a_struct: SubRecord, an_array_of_structs: Array[ArrayElement])

代替Map[String,String],如何创建一个udf,在数组的情况下接受名称或索引,并为复杂数据类型中的嵌套元素生成结果。假设现在我想查询a_map_new中包含的< code > val[0]。

共有1个答案

臧梓
2023-03-14

在这种情况下,如果您有定义良好的记录类型,我建议使用强类型<code>数据集:

val result = df.as[Record].map(_.a_map_new.mapValues(_.headOption))

result.printSchema
// root
//  |-- value: map (nullable = true)
//  |    |-- key: string
//  |    |-- value: struct (valueContainsNull = true)
//  |    |    |-- foo: string (nullable = true)
//  |    |    |-- bar: integer (nullable = false)
//  |    |    |-- vals: array (nullable = true)
//  |    |    |    |-- element: double (containsNull = false)

使用udf的障碍是它的不对称性质:

  • 它获取内部类型<code>行<code>
  • 应返回外部类型
  • 必须具有静态定义的返回类型

任何返回结构的通用解决方案都应该知道如何将映射到外部类型。我想你可以设计这样的东西(伪代码)

def f(mapper: Row => T) = udf((map: Map[U, Row]) => map.mapValues(mapper(_)))
 类似资料:
  • 如何查询具有复杂类型(如映射/数组)的RDD?例如,当我编写此测试代码时: 我认为语法应该是这样的: 或 但我明白了 无法访问类型MapType(StringType,StringType,true)中的嵌套字段 和 组织。阿帕奇。火花sql。催化剂错误。包$TreeNodeException:未解析的属性 分别地

  • 本文向大家介绍Dapper.NET 查询动态类型,包括了Dapper.NET 查询动态类型的使用技巧和注意事项,需要的朋友参考一下 示例 如果不使用泛型类型,也可以动态查询。            

  • 问题内容: 如何查询具有复杂类型(如地图/数组)的RDD?例如,当我编写此测试代码时: 我认为语法应该是这样的: 或者 但是我明白了 无法访问类型为MapType(StringType,StringType,true)的嵌套字段 和 org.apache.spark.sql.catalyst.errors.package $ TreeNodeException:无法解析的属性 分别。 问题答案:

  • 我使用Spring引导和Spring数据JPA。它工作得很好但是!我需要使用复杂的本地查询从Oracle数据库(源数据从SAP ERP)。 假设查询包含5个joned表(一个键或组合键)。我可以使用很多参数。 解决方案: 1)由于耗时,使用JPA为该查询编写新查询是不真实的。创建表之间的所有键关系似乎很复杂。 2)为了运行这些查询,我使用JDBC。这很容易,因为我准备了本机查询。但我深信这种做法是

  • pg 相对于其它关系型数据库的一大优势就在于成熟的复杂类型支持,包括数组、JSON 对象、HStore 等等。 Array pg 的数组功能非常强大,支持类型数组、多维数组、定长数组。 定义一个简单的数组列: CREATE TABLE sample_table ( array_example integer[], ); 对应插入语句: INSERT INTO sample_table

  • 问题内容: 我对数据库还很陌生,所以如果这是一个愚蠢的问题,请原谅我。 在现代数据库中,如果我使用索引来访问行,则我相信这将是O(1)复杂性。但是,如果我查询选择另一列,它是O(1)还是O(n)?数据库是否必须遍历所有行,还是为每列建立一个排序列表? 问题答案: 实际上,我认为基于索引的访问将是O(log(n)),因为您仍将通过类似B-Tree的组织进行搜索以获取记录。