使用模式将json字符串适配到数据帧

使用模式将json字符串适配到数据帧,json,apache-spark,dataframe,rdd,Json,Apache Spark,Dataframe,Rdd,我有一个如下所示的模式: StructType(StructField(keys,org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7,true)) 我有一个json字符串(与此模式匹配),需要将其转换为适合上述模式 "{"keys" : [2.0, 1.0]}" 如何从该字符串中获取数据帧,以获取与模式匹配的数据帧? 以下是我在scala笔记本中尝试的步骤: val rddData2 = sc.parallelize("""{"keys" : [1.0

我有一个如下所示的模式:

StructType(StructField(keys,org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7,true))
我有一个json字符串(与此模式匹配),需要将其转换为适合上述模式

"{"keys" : [2.0, 1.0]}"
如何从该字符串中获取数据帧,以获取与模式匹配的数据帧? 以下是我在scala笔记本中尝试的步骤:

val rddData2 = sc.parallelize("""{"keys" : [1.0 , 2.0] }""" :: Nil)
val in = session.read.schema(schema).json(rddData2)
in.show
这是显示的输出:

+-----------+
|keys       |        
+-----------+
|null       |
+-----------+
如果您有一个json字符串作为

然后,您可以创建一个
dataframe
,而不使用
schema
as

val jsonRdd = sc.parallelize(Seq(jsonString))
val df = sqlContext.read.json(jsonRdd)
root
 |-- keys: vector (nullable = true)
应该给你什么

+----------+
|keys      |
+----------+
|[2.0, 1.0]|
+----------+
使用
schema

root
 |-- keys: array (nullable = true)
 |    |-- element: double (containsNull = true)
现在,如果要将默认创建的数组列转换为Vector,则需要一个
udf
函数作为

import org.apache.spark.sql.functions._
def vectorUdf = udf((array: collection.mutable.WrappedArray[Double]) => org.apache.spark.ml.linalg.Vectors.dense(Array(array: _*)))
并使用
.withColumn
调用
udf
函数

df.withColumn("keys", vectorUdf(col("keys")))
您应该使用
schema
as获取数据帧

val jsonRdd = sc.parallelize(Seq(jsonString))
val df = sqlContext.read.json(jsonRdd)
root
 |-- keys: vector (nullable = true)