Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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_Dataframe_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 用于触发数据帧的自定义行(自定义类型列表)

Scala 用于触发数据帧的自定义行(自定义类型列表),scala,dataframe,apache-spark,apache-spark-sql,Scala,Dataframe,Apache Spark,Apache Spark Sql,我目前在创建Spark行对象并将其转换为Spark数据帧时遇到一些问题。我想要达到的是 我有两个自定义类型列表,它们看起来或多或少像下面的类 case类MyObject(名称:String,年龄:Int) 案例类MyObject 2(xyz:字符串,abc:双精度) val listOne=List(MyObject(“aaa”,22),MyObject(“sss”,223)), val listTwo=列表(MyObject2(“bbb”,23),MyObject2(“abc”,2332))

我目前在创建Spark行对象并将其转换为Spark数据帧时遇到一些问题。我想要达到的是

我有两个自定义类型列表,它们看起来或多或少像下面的类

case类MyObject(名称:String,年龄:Int)
案例类MyObject 2(xyz:字符串,abc:双精度)
val listOne=List(MyObject(“aaa”,22),MyObject(“sss”,223)),
val listTwo=列表(MyObject2(“bbb”,23),MyObject2(“abc”,2332))
使用这两个列表,我想创建一个数据帧,它有一行和两个字段(fieldOne和fieldTwo)

为了实现这一点,我为MyObject、MyObject 2和我的ResultType创建了自定义结构类型

val myObjSchema=StructType(列表(
StructField(“名称”,StringType),
结构字段(“年龄”,整数类型)
))
val myObjSchema2=StructType(列表(
StructField(“xyz”,StringType),
结构字段(“abc”,双重类型)
))
val myRecType=StructType(
名单(
StructField(“myField”,ArrayType(myObjSchema)),
StructField(“myField2”,数组类型(myObjSchema2))
)
)
我在spark
行中填充了数据,并创建了一个数据框

val数据=行(
清单(MyObject(“aaa”,22),MyObject(“sss”,223)),
清单(MyObject2(“bbb”,23),MyObject2(“abc”,2332))
)
val df=spark.createDataFrame(
spark.sparkContext.parallelize(Seq(data)),myRecType
)
当我在数据帧上调用printSchema时,输出正是我所期望的

root
 |-- myField: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- name: string (nullable = true)
 |    |    |-- age: integer (nullable = true)
 |-- myField2: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- xyz: string (nullable = true)
 |    |    |-- abc: double (nullable = true)
然而,当我做一个节目时,我会得到一个运行时异常

Caused by: java.lang.RuntimeException: spark_utilities.example.MyObject is not a valid external type for schema of struct<name:string,age:int>
原因:java.lang.RuntimeException:spark_utilities.example.MyObject不是结构架构的有效外部类型
行对象似乎有问题,您能解释一下这里出了什么问题吗

非常感谢你的帮助


ps:我知道我可以创建一个定制的case类,比如
case class PH(ls:List[MyObject],ls2:List[MyObject2])
填充它并将其转换为数据集。但是由于一些限制,我不能使用这种方法,我想用上面提到的方法来解决它。

您不能简单地将案例类对象插入行中,您需要将这些对象转换为行

val data = Row(
      List(Row("aaa",22.toInt),Row("sss",223.toInt)),
      List(Row("bbb",23d),Row("abc",2332d))
    ) 
val df = spark.createDataFrame(
      spark.sparkContext.parallelize(Seq(data)),myRecType
)
val data = Row(
      List(Row("aaa",22.toInt),Row("sss",223.toInt)),
      List(Row("bbb",23d),Row("abc",2332d))
    ) 
val df = spark.createDataFrame(
      spark.sparkContext.parallelize(Seq(data)),myRecType
)