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。