使用架构

时间:2018-02-22 11:16:40

标签: json apache-spark dataframe rdd

我的架构看起来像这样:

StructType(StructField(keys,org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7,true))

我有一个json字符串(与此架构匹配),我需要转换为符合上述架构。

"{"keys" : [2.0, 1.0]}"

如何从此字符串中获取数据框以获取与我的架构匹配的DataFrame? 以下是我在scala笔记本中尝试过的步骤:

val rddData2 = sc.parallelize("""{"keys" : [1.0 , 2.0] }""" :: Nil)
val in = session.read.schema(schema).json(rddData2)
in.show

这是显示的输出:

+-----------+
|keys       |        
+-----------+
|null       |
+-----------+

1 个答案:

答案 0 :(得分:2)

如果 json string

val jsonString = """{"keys" : [2.0, 1.0]}"""

然后您可以创建dataframe而不schema作为

val jsonRdd = sc.parallelize(Seq(jsonString))
val df = sqlContext.read.json(jsonRdd)

应该给你

+----------+
|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: _*)))

并使用udf作为

调用.withColumn函数
df.withColumn("keys", vectorUdf(col("keys")))

您应该使用schema作为

获取 dataframe
root
 |-- keys: vector (nullable = true)