如何将多维数组添加到现有的Spark DataFrame

时间:2018-10-30 19:55:23

标签: apache-spark apache-spark-sql apache-spark-dataset

如果我理解正确,则可以将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 个答案:

答案 0 :(得分:1)

您的代码中有2个问题

  1. withColumn的第二个参数必须为Column。您可以使用函数col
  2. 包装常数值
  3. Spark无法将Any作为其列类型,您需要使用特定的受支持类型。

    val PropertiesDFPlusMultiDimArray = PropertiesDF.withColumn("ArrayCol", lit(Array.ofDim[Int](nrRows,nrCols)))

会成功的