Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 数组类型列中元素的数据类型修改_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 数组类型列中元素的数据类型修改

Scala 数组类型列中元素的数据类型修改,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个数据框,列col的模式如下 col:array element:struct Id:string Seq:int Pct:double Amt:long 当数据不可用时,下面是结构 col:array element:string 该列可以包含数据,也可以为空 数据可用时,其格式如下: {"Id": "123456-1", "Seq": 1, "Pct&

我有一个数据框,列col的模式如下

col:array
    element:struct
      Id:string
      Seq:int
      Pct:double
      Amt:long
当数据不可用时,下面是结构

col:array
   element:string
该列可以包含数据,也可以为空

数据可用时,其格式如下:

{"Id": "123456-1", "Seq": 1, "Pct": 0.1234, "Amt": 3000}
当数据不可用时,我将默认设置如下:

.withColumn("col", when (size($"col") === 0, array(lit("A").cast("string"), lit(0).cast("int"), lit(0.0).cast("double"))).otherwise($"col")
对于我获取的空数据,数据似乎被转换为字符串:

["A", "0", "0.0", "0.0"]
如何获得以下输出:

{"Id": "A", "Seq": 0, "Pct": 0.0}

当数据源中有可用数据时,以下为输出:

+----------------------------------------------------+
|   Data                                             |
+----------------------------------------------------+
|[[236711-1, 0.14, 1.5, 1], [236711-1, 0.14, 2.0, 2]]|
|[[1061605-1, 0.011, 1.0, 1]]                        |
+----------------------------------------------------+
当数据不可用时

| Data |
+------+
|[]    |
+------+


您可以创建一个结构的数组,而不是数组:

val df2 = df.withColumn(
    "col",     
    df.schema("col").dataType match {
        case ArrayType(StringType, _) =>
            array(
                struct(
                    lit("A").cast("string").as("Id"), 
                    lit(0).cast("int").as("Seq"), 
                    lit(0.0).cast("double").as("Pct")
                )
            )
        case ArrayType(StructType(_), _) => $"col"
    }
)

源格式看起来不像stringsI的数组。我已经更新了架构!谢谢,我也有一个长列,但是当我添加lit(0).cast(“long”)时,它会变为大int,并且由于数据类型不匹配而失败,这意味着你的列不是长类型。您是否能够执行
df.printSchema()
并在问题中提供结果?我已经更新了模式。它会持续很久!但是当我运行lit(0)时,它变为big int。cast(“long”)bigint和long是同一件事……您能显示
数据类型不匹配的完整错误消息吗?