Clojure - 使用 Flambo 时未在 DataFrame 中找到 select 方法的匹配方法

Clojure - No matching method found for select method in DataFrame when using Flambo

我正在使用包含给定列名的 Flambo to work with Spark. I want to retrieve a 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 No matching method found: select for class org.apache.spark.sql.DataFrame clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:80)

我做错了什么?为什么 col. 有效而 select. 无效,因为它们都可以从同一个 Class 获得? 如果我错了,请帮助我?

DataFrame.select 您尝试呼叫的签名如下:

def select(cols: Column*): DataFrame

如您所见,它接受 Column 的可变参数,而您为它提供了一个与签名不匹配的裸 Column 值,因此是例外。 Scala 的可变参数封装在 scala.collection.Seq 中。您可以使用以下代码将您的专栏包装成实现 Seq 的内容:

(scala.collection.JavaConversions/asScalaBuffer [(Column. "C0")])

在 Clojure 中,使用数组传递给可变参数字段。当我使用字符串和字符串数组在数据帧上调用 select 函数时,我遇到了同样的问题。

类似于

(def cols-vec ["a","b","c])

(defn covert->spark-cols [columns] (into [] (map #(Column. %) columns))

我们被 java api 在收集方面的工作方式所愚弄... 当方法签名说 ... java 可以使用一个值,因为 Clojure 需要一个集合。