Clojure 无法解析Cascalog中谓词中的符号

Clojure 无法解析Cascalog中谓词中的符号,clojure,cascalog,Clojure,Cascalog,我有一个疑问: (?<- (hfs-textline data-out :sinkmode :replace) [?item1 ?item2] ((hfs-textline data-in) ?line) (data-line? ?line) (filter-out-data (#(vector (s/split % #",")) ?line) :> ?item1 ?item2) ) (defn dat

我有一个疑问:

(?<- (hfs-textline data-out :sinkmode :replace)
        [?item1 ?item2]
        ((hfs-textline data-in) ?line)
        (data-line? ?line)
        (filter-out-data (#(vector (s/split % #",")) ?line) :> ?item1 ?item2)
        )

(defn data-line? [^String row]
  (and (not= -1 (.indexOf row ","))
       (not (.endsWith row ","))
       (not (.startsWith row ","))))

(defn filter-out-data [data]
  (<- [?item1 ?item2]
      (data :#> 9 {4 ?item1
                  8 ?item2})))
(?项目1?项目2)
)
(定义数据行?[^String行]
(和(非=-1(.indexOf row“,”))
(不是(.endsWith行“,”))
(不是(.startsWith row“,”)))
(defn筛选出数据[数据]
(9{4?项目1)
8(第2项})
该查询逐行读取CSV文件,并检查符合有效数据条件的行(
数据行?
)-此部分有效。然后用逗号分割行,并将向量传递给
过滤数据
函数,该函数依次返回从该向量中提取的两项。当我执行查询时,我得到以下错误: 无法在此上下文中解析符号:
?行


我一直在尝试不同的方法来传递分割结果(我希望它是灵活的,因为分割的大小会有所不同)。我只是从Clojure和Cascalog开始,如果你能为我指出正确的方向,我将不胜感激。谢谢

函数
过滤数据
生成一个子查询,但您试图将其用作谓词,这是行不通的

我建议您将表达式
(#(vector(s/split%#“,”)行)
中的所有逻辑移到一个常规函数中,您仍然可以调用
填充数据

(defn filter-out-data [data]
  (let [[_ _ _ item1 _ _ _ item2] (s/split % #"," data))]
    [item1 item2]))

(?<- (hfs-textline data-out :sinkmode :replace)
    [?item1 ?item2]
    ((hfs-textline data-in) ?line)
    (data-line? ?line)
    (filter-out-data ?line :> ?item1 ?item2))
(defn过滤数据[数据]
(让[[uuuuiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
[第1项第2项])
(?项目1?项目2))

但是,您可以使用CSV库来简化代码,如。

这是一个猜测,因为我对Cascalog不太熟悉,但可能只有当
?行
符号位于查询的“第一级”时,逻辑解算器才会解析它。尝试将
s/split
移动到
过滤数据
函数,这样您就可以使用
(过滤数据行:>?item1?item2)
作为查询的表达式。它从一个谓词传递到下一个谓词。在Cascalog查询中,输出变量(?在本例中为行)受谓词使用的约束。他们点的菜不重要。问题正如sortega所解释的,但解决方案是将表达式移动到函数,因此您的猜测是正确的:)这很有帮助。非常感谢。我还将研究如何使用data.csv。