我使用Flambo与Spark合作。我想检索包含给定列名的DataFrame。我写了一个简单的函数如下:
(defn make-dataset
([data-path column-names and-another]
(let [data (sql/read-csv sql-context data-path)
cols (map #(.col data %) column-names)]
(.select data (Column. "C0")))))
执行时会出现以下异常。
IllegalArgumentException找不到匹配的方法:为类org.apache.spark.sql.DataFrame选择clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:80)
我做错了什么?为什么col.
可以正常工作,而select.
当两个都可以从同一个班级中获得时,它们不起作用?
如果我错了,请帮帮我?
答案 0 :(得分:4)
DataFrame.select
有以下签名:
def select(cols: Column*): DataFrame
正如您所看到的,它接受Column
的变量,而您提供的单个裸Column
值与签名不匹配,因此例外。 Scala的varargs包含在scala.collection.Seq
中。您可以使用以下代码将列包装为实现Seq
的内容:
(scala.collection.JavaConversions/asScalaBuffer [(Column. "C0")])
答案 1 :(得分:0)
在Clojure中,使用Arrays传递给varargs字段。当我使用String和String of String调用dataframe上的select函数时,我遇到了同样的问题。
类似
(def cols-vec [" a"," b"," c])
(defn covert-> spark-cols [columns](进入[](map#(Column。%)列)))
我们被java api在收集时的工作方式所迷惑...... 当方法签名说...如果Clojure期望收集一个值,那么java就可以了。