Scala сравнить поле типа комплексного массива данных - PullRequest
1 голос
/ 28 апреля 2020

Я пытаюсь создать фрейм данных для передачи функции в рамках моих модульных тестов. Если у меня есть следующее

val myDf = sparkSession.sqlContext.createDataFrame(
  sparkSession.sparkContext.parallelize(Seq(
    Row(Some(Seq(MyObject(1024, 100001D), MyObject(1, -1D)))))),
    StructType(List(
      StructField("myList", ArrayType[???], true)
    )))

MyObject - это класс case.

Я не знаю, что поставить для типа объекта. Какие-либо предложения? Я пробовал ArrayType практически для всех возможных комбинаций.

Я ищу фрейм данных, который выглядит примерно так:

+--------------------+
|   myList           |
+--------------------+
| [1024, 100001]     |
| [1, -1]            |
+--------------------+

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Идет в обратном направлении ...

val s = Seq(Array(1024, 100001D), Array(1, -1D)).toDS().toDF("myList")
println(s.schema)
s.printSchema
s.show

Ваша схема похожа на ниже ... DoubleType идет, так как эти 100001D и -1D двойные.

StructType(StructField(myList,ArrayType(DoubleType,false),true))

Вывод вам нужно:

root
 |-- myList: array (nullable = true)
 |    |-- element: double (containsNull = false)

+------------------+
|             myList|
+------------------+
|[1024.0, 100001.0]|
|       [1.0, -1.0]|
+------------------+

Или так же вы можете сделать это.

case class MyObject(a:Int , b:Double)

val s = Seq(MyObject(1024, 100001D), MyObject(1, -1D)).toDS()
  .select(struct($"a",$"b").as[MyObject] as "myList")
println(s.schema)
s.printSchema
s.show

Результат:

//schema :
StructType(StructField(myList,StructType(StructField(a,IntegerType,false), StructField(b,DoubleType,false)),false))

root
 |-- myList: struct (nullable = false)
 |    |-- a: integer (nullable = false)
 |    |-- b: double (nullable = false)

+----------------+
|          myList|
+----------------+
|[1024, 100001.0]|
|       [1, -1.0]|
+----------------+
0 голосов
/ 28 апреля 2020

Попробуйте это

scala> case class MyObject(prop1:Int, prop2:Double)
defined class MyObject

scala> val df = Seq((1024, 100001D), (1, -1D)).toDF("prop1","prop2").select(struct($"prop1",$"prop2").as[MyObject] as "myList")
df: org.apache.spark.sql.DataFrame = [myList: struct<prop1: int, prop2: double>]

scala> df.show(false)
+----------------+
|myList          |
+----------------+
|[1024, 100001.0]|
|[1, -1.0]       |
+----------------+


scala> df.printSchema
root
 |-- myList: struct (nullable = false)
 |    |-- prop1: integer (nullable = false)
 |    |-- prop2: double (nullable = false)


...