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

JAVAlang.RuntimeException:scala。收集不可变$冒号$冒号不是结构

令狐运珧
2023-03-14

我想使用此模式创建一个数据帧:

 |-- Col1 : string (nullable = true)
 |-- Col2 : string (nullable = true)
 |-- Col3 : struct (nullable = true)
 |    |-- 513: long (nullable = true)
 |    |-- 549: long (nullable = true)

代码:

val someData = Seq(
      Row("AAAAAAAAA", "BBBBB", Seq(513, 549))
    )

val col3Fields = Seq[StructField](StructField.apply("513",IntegerType, true), StructField.apply("549",IntegerType, true))

val someSchema = List(
  StructField("Col1", StringType, true),
  StructField("Col2", StringType, true),
  StructField("Col3", StructType.apply(col3Fields), true)
)

val someDF = spark.createDataFrame(
  spark.sparkContext.parallelize(someData),
  StructType(someSchema)
)

someDF.show

但是有一些。显示抛出:

错误执行器:阶段0.0(TID 0)java中任务0.0中出现异常。lang.RuntimeException:编码时出错:java。lang.RuntimeException:scala。收集不可变$冒号$冒号不是结构架构的有效外部类型

编辑:

513和549应该是子列名而不是值。这是我期望的输出示例:

someDF.select("Col1","Col2","Col3.*").show

+-----------+--------+------+------+
|       Col1|    Col1|   513|   549|
+-----------+--------+------+------+
| AAAAAAAAA |  BBBBB |    39|    38|
+-----------+--------+------+------+

共有1个答案

司徒焕
2023-03-14

你拥有的数据和你拥有的模式是不一样的,你要创建的模式在这里

val schema = StructType(
  Seq(
    StructField("col1", StringType, true),
    StructField("col2", StringType, true),
    StructField("col3", StructType(
      Seq(
        StructField("513", LongType, true),
        StructField("549", LongType, true)
      ))
    )
  )
)

架构:

root
 |-- col1: string (nullable = true)
 |-- col2: string (nullable = true)
 |-- col3: struct (nullable = true)
 |    |-- 513: long (nullable = true)
 |    |-- 549: long (nullable = true)

这将为您提供所需的模式

您可以按如下方式获取数据并应用架构

val someData = Seq(
  Row("AAAAAAAAA", "  BBBBB", Row(39l, 38l))
)

val someDF = spark.createDataFrame(
  spark.sparkContext.parallelize(someData), schema
)

df.select("Col1","Col2","Col3.*").show 

输出:

+---------+-------+---+---+
|     Col1|   Col2|513|549|
+---------+-------+---+---+
|AAAAAAAAA|  BBBBB| 39| 38|
+---------+-------+---+---+
 类似资料:
  • 主要内容:示例冒号()是MATLAB中最有用的操作符之一。它用于创建向量,下标数组,并为迭代指定。 如果要创建一个包含从到的整数的行向量,则书写为 - MATLAB执行语句并返回一个包含整数的行向量,从到 - 如果要指定一个增量值,例如 - MATLAB执行语句并返回以下结果 - 再来看看一个例子 - MATLAB执行语句并返回以下结果 - 可以使用冒号运算符创建索引向量,以选择数组的行,列或元素。 下表描述了

  • 问题内容: 我有这样的字符串 我想用冒号作为分隔符,而不是双冒号。所需结果: 我正在尝试: 但我得到了错误的结果。 在此期间,我逃避,用 问题答案: 您可以继续讨论。这使用两个否定的环视(回溯和回溯),它们断言有效匹配只有一个冒号,在它之前或之后没有冒号。 解释模式: 这两种环视都是必需的,因为如果只有后向,则正则表达式引擎将匹配其中的第一个冒号(因为前一个字符不是冒号),如果只有前瞻,则第二个冒

  • 冒号:是MATLAB里面一个十分重要的算子,适用于各种不同的表达式。 例如表达式   1:10 表示一行从1到10的整数 1 2 3 4 5 6 7 8 9 10 为了改变递变的间隔,可以指定一个间隔长度 ,例如   100:-7:50 表示为 100 93 86 79 72 65

  • 问题内容: 由于IE7和IE8不支持对伪元素(例如或)使用双冒号表示法,并且由于现代浏览器支持向后兼容的单冒号(例如),我应该仅使用单冒号表示法以及何时使用IE8的市场份额下降到可以忽略的水平,然后回去查找/替换我的代码库?还是我都应该同时包括: 如果我关心IE8用户(可怜的朋友),单独使用double似乎很愚蠢。 问题答案: 请勿 同时 使用逗号和逗号。兼容CSS 2.1(不支持CSS3)的用户

  • 问题内容: 我碰到了以下内容 在这种情况下,和是什么意思? 问题答案: 它称为条件运算符(是三元运算符)。 它有以下形式:?: 认为“ then”和“ else”。 您的代码等同于

  • Eclipse报告以下错误(每一行): 令牌“!=”上出现语法错误,AssignmentOperator无效 令牌“return”出现语法错误,请删除此令牌 类型不匹配:无法从布尔值转换为int值 变量: 特塞雷皮亚努拉私人酒店; 私人信息; 私人信息; 特塞雷德斯托一等兵; 私人int tessereFiume; 特塞雷博斯科私人酒店; 枚举类: