【问题标题】:Unable to resolve symbol in a predicate in Cascalog无法解析 Cascalog 中谓词中的符号
【发布时间】:2013-07-07 13:57:18
【问题描述】:

我有这个问题:

(?<- (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 开始,如果你能指出我正确的方向,我将不胜感激。谢谢!

【问题讨论】:

  • 这是一个疯狂的猜测,因为我对 Cascalog 不太熟悉,但也许 ?line 符号只有在查询的“第一级”上才会被逻辑求解器解析。尝试将s/split 移动到filter-out-data 函数,这样您就剩下(filter-out-data ?line :&gt; ?item1 ?item2) 作为查询的表达式。
  • 它从一个谓词传递到下一个谓词。在 Cascalog 查询中,输出变量(本例中为?line)受谓词的使用限制。他们的顺序无关紧要。问题正如 sortega 解释的那样,但解决方案是将表达式移动到函数,所以你的猜测是一个很好的:)

标签: clojure cascalog


【解决方案1】:

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

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

(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 库来进一步简化代码。

【讨论】:

  • 它有帮助。谢谢你。我也会考虑使用 data.csv。
猜你喜欢
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多