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 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})))

查询逐行读取 CSV 文件并检查满足有效数据条件的行 (data-line?) - 这部分有效。然后它应该用逗号分隔行,并将向量传递给 filter-out-data 函数,该函数又返回从该向量中提取的两个项目。当我执行查询时,出现以下错误: 无法解析符号:?line 在此上下文中。

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

最佳答案

filter-out-data 函数生成了一个子查询,但您正试图将其用作谓词,但这是行不通的。

我建议您将表达式 (#(vector (s/split % #",")) ?line) 中的所有逻辑移动到您仍然可以调用的常规函数​​中 填写数据

(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))

但是,您可以使用像 data.csv 这样的 CSV 库来进一步简化代码。 .

关于clojure - 无法解析 Cascalog 中谓词中的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17512789/

相关文章:

dictionary - 给定 Clojure 中的一系列映射,如何过滤键的值 >(某个值)?

clojure - Clojure 中的渐进式关联

hadoop - Cascalog:启动uberjar并在hadoop上进行main

hadoop - Cascalog first-n - 无法连接谓词

hadoop - clojure:使用多台计算机进行并行处理

clojure - 在 Clojure 中,如何在我自己的记录和类型上实现标准 Clojure 集合接口(interface)?

java - 在 Clojure/Java 中通过自定义协议(protocol)建立 HTTP 隧道

clojure - 如何检测符号是否解析为 (var contains a) 宏?

hadoop - 使用 cascalog 将同现计数转化为同现概率