diff options
Diffstat (limited to 'scalding/src/main')
-rw-r--r-- | scalding/src/main/scala/sandcrawler/HBaseBuilder.scala | 46 | ||||
-rw-r--r-- | scalding/src/main/scala/sandcrawler/HBaseRowCountJob.scala | 18 |
2 files changed, 55 insertions, 9 deletions
diff --git a/scalding/src/main/scala/sandcrawler/HBaseBuilder.scala b/scalding/src/main/scala/sandcrawler/HBaseBuilder.scala new file mode 100644 index 0000000..87cc0cb --- /dev/null +++ b/scalding/src/main/scala/sandcrawler/HBaseBuilder.scala @@ -0,0 +1,46 @@ +package sandcrawler + +import cascading.tuple.Fields +import parallelai.spyglass.hbase.HBaseConstants.SourceMode +import parallelai.spyglass.hbase.HBaseSource +import scala._ + +object HBaseBuilder { + // map from column families to column names + val schema = Map("f" -> List("c"), + "file" -> List("size", "mime", "cdx"), + "grobid0" -> List("status_code", "quality", "status", "tei_xml", "tei_json", "metadata"), + "match0" -> List("status", "doi", "info")) + val inverseSchema = {for ((k,vs) <- schema; v <-vs) yield (k + ":" + v)}.toList + + // The argument should be a comma-separated list of family:column, such as "f:c, file:size". + @throws(classOf[IllegalArgumentException]) + def parseColSpec(colSpecs: List[String]) : (List[String], List[Fields]) = { + // Verify that all column specifiers are legal. + for (colSpec <- colSpecs) { + if (!(inverseSchema contains colSpec)) { + throw new IllegalArgumentException("No such column: " + colSpec) + } + val pair = colSpec split(":") + if (colSpec.split(":").length != 2) { + throw new IllegalArgumentException("Bad column specifier " + colSpec + + " (specifiers should be family:name)") + } + } + + // Produce and return a tuple containing: + // 1. A list of column families. + // 2. A corresponding list of Fields, each containing column names. + val groupMap: Map[String, List[String]] = colSpecs.groupBy(c => (c split ":")(0)) + val families = groupMap.keys.toList + val groupedColNames : List[List[String]] = families map {fam => { + val cols = {groupMap(fam).map(v => v.split(":")(1))} + cols}} + (families, groupedColNames.map({fields => new Fields(fields : _*)})) + } + + def build(table: String, server: String, colSpec: List[String], sourceMode: SourceMode, keyList: List[String] = List("key")) = { + val (families, fields) = parseColSpec(colSpec) + new HBaseSource(table, server, new Fields("key"), families, fields, sourceMode = sourceMode, keyList = keyList) + } +} diff --git a/scalding/src/main/scala/sandcrawler/HBaseRowCountJob.scala b/scalding/src/main/scala/sandcrawler/HBaseRowCountJob.scala index d47fe60..9d074ab 100644 --- a/scalding/src/main/scala/sandcrawler/HBaseRowCountJob.scala +++ b/scalding/src/main/scala/sandcrawler/HBaseRowCountJob.scala @@ -16,17 +16,17 @@ class HBaseRowCountJob(args: Args) extends JobBase(args) with HBasePipeConversio val output = args("output") - val hbs = new HBaseSource( - //"table_name", - //"quorum_name:2181", - "wbgrp-journal-extract-0-qa", // HBase Table Name - "mtrcs-zk1.us.archive.org:2181", // HBase Zookeeper server (to get runtime config info; can be array?) - new Fields("key"), - List("file"), - List(new Fields("size", "mimetype")), - sourceMode = SourceMode.SCAN_ALL) + HBaseRowCountJob.getHBaseSource .read .debug .groupAll { _.size('count) } .write(Tsv(output)) } + +object HBaseRowCountJob { + def getHBaseSource = HBaseBuilder.build( + "wbgrp-journal-extract-0-qa", // HBase Table Name + "mtrcs-zk1.us.archive.org:2181", // HBase Zookeeper server (to get runtime config info; can be array?) + List("file:size", "file:mime"), + SourceMode.SCAN_ALL) +} |