如何将多维数组添加到现有的 Spark DataFrame
Posted
技术标签:
【中文标题】如何将多维数组添加到现有的 Spark DataFrame【英文标题】:How to add multidimensional array to an existing Spark DataFrame 【发布时间】:2018-10-30 19:55:22 【问题描述】:如果我理解正确,可以将 ArrayType 添加为 Spark DataFrame 列。我正在尝试使用 withColumn
方法将多维数组添加到现有的 Spark DataFrame 中。我的想法是让这个数组可用于每个 DataFrame 行,以便使用它从 map 函数发回信息。
我得到的错误是 withColumn
函数正在寻找 Column
类型,但它正在获取一个数组。是否有任何其他功能可以添加ArrayType
?
object TestDataFrameWithMultiDimArray
val nrRows = 1400
val nrCols = 500
/** Our main function where the action happens */
def main(args: Array[String])
// Create a SparkContext using every core of the local machine, named RatingsCounter
val sc = new SparkContext("local[*]", "TestDataFrameWithMultiDimArray")
val sqlContext = new SQLContext(sc)
val PropertiesDF = sqlContext.read
.format("com.crealytics.spark.excel")
.option("location", "C:/Users/tjoha/Desktop/Properties.xlsx")
.option("useHeader", "true")
.option("treatEmptyValuesAsNulls", "true")
.option("inferSchema", "true")
.option("addColorColumns", "False")
.option("sheetName", "Sheet1")
.load()
PropertiesDF.show()
PropertiesDF.printSchema()
val PropertiesDFPlusMultiDimArray = PropertiesDF.withColumn("ArrayCol", Array.ofDim[Any](nrRows,nrCols))
感谢您的帮助。
亲切的问候,
约翰
【问题讨论】:
【参考方案1】:您的代码中有 2 个问题
withColumn
的第二个参数必须是 Column
。你可以用函数col
包装常量值
Spark 不能将Any
作为其列类型,您需要使用特定支持的类型。
val PropertiesDFPlusMultiDimArray = PropertiesDF.withColumn("ArrayCol", lit(Array.ofDim[Int](nrRows,nrCols)))
会成功的
【讨论】:
您好,谢谢您的回答。 lit() 是做什么的?我的最终目标是为 DataFrame 中的每一行数据计算多行多列的值,并将其作为数组返回。数组中会有多种不同类型的数据,包括字符串、整数和浮点数。您对实现此类功能有任何想法吗?另外,您在上面设置的数组是否与多维数组兼容?一旦我得到答案,我将创建一个新帖子,因为答案会引发新问题。 我看到 lit() 创建了一列文字值。 @TJVR 静态类型语言中的数组对于所有元素总是具有相同的类型。也许您想为此列创建一个新的StructType
,或者将所有数组分别添加为一列?
哇,您是如何挖掘出在lit
eral 函数中指定类型的能力?以上是关于如何将多维数组添加到现有的 Spark DataFrame的主要内容,如果未能解决你的问题,请参考以下文章
NodeJS 和 Mongoose:将元素添加到现有的空数组
如何使用 map() 或 foreach() 将新对象添加到现有的 useState 数组?