我正在使用弗拉博与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.却不能工作,因为它们都来自同一个类?如果我错了请帮帮我?
发布于 2016-03-16 13:36:59
您试图调用的DataFrame.select具有以下签名:
def select(cols: Column*): DataFrame正如您所看到的,它接受一个Column的vararg,而您提供了一个单独的、裸露的Column值,它与签名不匹配,因此是异常。Scala的varargs被包装在scala.collection.Seq中。可以使用以下代码将列包装成实现Seq的内容:
(scala.collection.JavaConversions/asScalaBuffer [(Column. "C0")])发布于 2018-03-14 03:29:17
在Clojure中,使用数组传递给varargs字段。当我使用String和Array of String在dataframe上调用select函数时,同样的问题也得到了解决。
就像这样
(车辆编号"a“、"b”、“c”)
(暗->星火- 列)
当涉及到集合时,我们会被java api的工作方式愚弄.当方法签名说..。java可以使用一个值,正如Clojure所期望的那样,其中一个值是集合。
https://stackoverflow.com/questions/36036591
复制相似问题