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

从火花中读取结构在 scala 中

东郭自珍
2023-03-14

我正在运行以下scala代码:

val hiveContext=new org.apache.spark.sql.hive.HiveContex(sc)
val df=hiveContext.sql("SELECT * FROM hl7.all_index")
val rows=df.rdd
val firstStruct=rows.first.get(4)
//I know the column with index 4 IS a StructType
val fs=firstStruct.asInstanceOf[StructType]
//now it fails
//what I'm trying to achieve is
log.println(fs.apply("name"))

我知道firstStruct是structType,StructFields的一个名称是“name”,但在尝试强制转换时似乎失败了。我被告知spark/hive结构与scala不同,但为了使用structType,我需要

import org.apache.spark.sql.types._

所以我想他们应该是同一种类型的。

我看了看这里:https://github.com/apache/spark/blob/master/sql/catalyst/src/main/scala/org/apache/spark/sql/types/StructType.scala

以便查看如何到达structField。

谢谢!

共有1个答案

微生俊捷
2023-03-14

模式类型是逻辑类型。它们不会一对一地映射到具有该模式类型的列中的对象类型。

例如,蜂巢/SQL 对 64 位整数使用 BIGINT,而 SparkSQL 使用长类型。Scala 中数据的实际类型是长数据。这是您遇到的问题。

Hive中的struct(SparkSQL中的structType)在数据框中由Row表示。因此,您要做的是以下操作之一:

row.getStruct(4)

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

  • 试图读取一个空的镶木地板目录,得到这个错误 无法指定拼花地板的架构。必须手动指定 我的代码 尝试处理scala尝试和定期检查空目录 任何想法

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

  • 嗨,我正在尝试生成Salt示例的输出,但没有使用文档中提到的docker。我找到了帮助生成输出的scala代码,这是main.scala。我将main.scala修改为一个方便的main.scala, 我为这个scala创建了一个单独的文件夹, calac-cp“lib/salt.jar:lib/spark.jar”main.scala 这已成功运行并在文件夹BinexTest下生成类。 现在,项

  • 我正在使用spark structured streaming(2.2.1)来消费来自Kafka(0.10)的主题。 我的检查点位置设置在外部HDFS目录上。在某些情况下,我希望重新启动流式应用程序,从一开始就消费数据。然而,即使我从HDFS目录中删除所有检查点数据并重新提交jar,Spark仍然能够找到我上次使用的偏移量并从那里恢复。偏移量还在哪里?我怀疑与Kafka消费者ID有关。但是,我无法