Clojure - 使用Flambo时,没有为DataFrame中的select方法找到匹配方法

时间:2016-03-16 13:07:28

标签: apache-spark clojure apache-spark-sql spark-dataframe flambo

我使用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.当两个都可以从同一个班级中获得时,它们不起作用? 如果我错了,请帮帮我?

2 个答案:

答案 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就可以了。