我想从一个可以匹配现有架构的字符串列表中创建一个DataFrame。 这是我的代码。
val rowValues = List("ann", "f", "90", "world", "23456") // fails
val rowValueTuple = ("ann", "f", "90", "world", "23456") //works
val newRow = sqlContext.sparkContext.parallelize(Seq(rowValueTuple)).toDF(df.columns: _*)
val newdf = df.unionAll(newRow).show()
如果我使用String of List,相同的代码将失败。我发现差异在于rowValueTuple
已创建Tuple
。
由于rowValues
列表的大小动态变化,我无法手动创建Tuple*
对象。
我怎样才能做到这一点?我错过了什么?如何平整此列表以满足要求?
请感谢您的帮助。
答案 0 :(得分:13)
DataFrame具有固定列数的模式,因此每个变量长度列表生成行似乎并不自然。无论如何,您可以使用现有架构从RDD [Row]创建DataFrame,如下所示:
val rdd = sqlContext.sparkContext.parallelize(Seq(rowValues))
val rowRdd = rdd.map(v => Row(v: _*))
val newRow = sqlContext.createDataFrame(rdd, df.schema)