【发布时间】:2018-11-29 12:08:53
【问题描述】:
我有两个数组:
val customers = Array("Alice", "Bob", "Mike","Charly")
val customersLen = customers.length
val items = Array("milk", "bread", "butter", "apples", "oranges")
val itemsLen = items.length
val size = (customersLen*itemsLen)-1
我可以像这样在一个数组中创建这两个数组的笛卡尔积:
val cartesianProd= for(i <- 0 to size) yield (customers(i % customersLen ),items(i % itemsLen ))
输出将是:
cartesianProd: scala.collection.immutable.IndexedSeq[(String, String)] =向量((爱丽丝,牛奶),(鲍勃,面包),(迈克,黄油),(查理,苹果),(爱丽丝,橙子),(鲍勃,牛奶),(迈克,面包),(查理,黄油) , (爱丽丝,苹果),(鲍勃,橙子),(迈克,牛奶),(查理,面包), (爱丽丝,黄油),(鲍勃,苹果),(迈克,橙子),(查理,牛奶), (Alice,bread), (Bob,butter), (Mike,apples), (Charly,oranges))
现在我想从这个数组生成一个数据框。重用之前的逻辑,所以我写了:
val dfCustItem = Seq(for(i <- 0 to size ) yield(customers (i % customersLen ),items(i % itemsLen ))).toDF("customer","item")
但我收到以下错误:
java.lang.IllegalArgumentException:要求失败:数量 列不匹配。旧列名 (1): value 新列名 (2): 名称,项目在 scala.Predef$.require(Predef.scala:224) 在 org.apache.spark.sql.Dataset.toDF(Dataset.scala:397) 在 org.apache.spark.sql.DatasetHolder.toDF(DatasetHolder.scala:44) ... 48 省略
据我了解,这是因为 yield 在名为 value 的单个列中返回 pair(customer,item),而 toDF 需要两个独立的列(不确定这些列的名称是否相关)
我该如何解决这个问题?也就是在两个独立的列中产生循环的输出
【问题讨论】:
-
为什么不将每个数组转换成 DataFrame,然后对这些 DataFrame 做笛卡尔积?
标签: arrays scala apache-spark