我正在尝试创建一个地图减少工作在Java的表从一个HBase数据库。使用这里的示例和internet上的其他内容,我成功地编写了一个简单的行计数器。然而,试图编写一个实际对列中的数据执行某些操作的程序是不成功的,因为接收的字节总是空的。
我的司机工作的一部分是这样的:
/* Set main, map and reduce classes */
job.setJarByClass(Driver.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
Scan scan = new Scan();
scan.setCaching(500);
scan.setCacheBlocks(false);
/* Get data only from the last 24h */
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
try {
long now = timestamp.getTime();
scan.setTimeRange(now - 24 * 60 * 60 * 1000, now);
} catch (IOException e) {
e.printStackTrace();
}
/* Initialize the initTableMapperJob */
TableMapReduceUtil.initTableMapperJob(
"dnsr",
scan,
Map.class,
Text.class,
Text.class,
job);
/* Set output parameters */
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setOutputFormatClass(TextOutputFormat.class);
如您所见,该表称为dnsr
。我的映射器如下所示:
@Override
public void map(ImmutableBytesWritable row, Result value, Context context)
throws InterruptedException, IOException {
byte[] columnValue = value.getValue("d".getBytes(), "fqdn".getBytes());
if (columnValue == null)
return;
byte[] firstSeen = value.getValue("d".getBytes(), "fs".getBytes());
// if (firstSeen == null)
// return;
String fqdn = new String(columnValue).toLowerCase();
String fs = (firstSeen == null) ? "empty" : new String(firstSeen);
context.write(new Text(fqdn), new Text(fs));
}
一些注意事项:
dnsr
表中的列族只是d
。有多个列,其中一些列称为FQDN
和FS
(第一次看到);fqdn
值正确显示,但fs始终是“空”字符串(在出现一些错误表示无法将null转换为新字符串后,我添加了此检查);fs
列名,例如ls
(lastSeen),则可以使用;我用javascript创建了一个简单的表扫描程序,它查询完全相同的表和列,我可以清楚地看到这些值。使用命令行并手动进行查询,我可以清楚地看到fs
值不是null,它们是字节,以后可以转换为字符串(表示日期)。
我总是空的问题是什么?
谢谢!
更新:如果我获得了特定列族中的所有列,我不会收到fs
。但是,javascript中实现的简单扫描程序将fs
作为dnsr
表中的列返回。
@Override
public void map(ImmutableBytesWritable row, Result value, Context context)
throws InterruptedException, IOException {
byte[] columnValue = value.getValue(columnFamily, fqdnColumnName);
if (columnValue == null)
return;
String fqdn = new String(columnValue).toLowerCase();
/* Getting all the columns */
String[] cns = getColumnsInColumnFamily(value, "d");
StringBuilder sb = new StringBuilder();
for (String s : cns) {
sb.append(s).append(";");
}
context.write(new Text(fqdn), new Text(sb.toString()));
}
我用这里的一个答案得到了所有的列名。
最后,我终于找到了问题所在。Hbase是一个面向列的数据存储。在这里,数据以列形式存储和检索,因此,如果只需要某些数据,则只能读取相关数据。每个列族都有一个或多个列限定符(列),每个列都有多个单元格。有趣的部分是每个细胞都有自己的时间戳。
为什么是这个问题?那么,当您在进行范围搜索时,只返回其时间戳在该范围内的单元格,因此您可能会得到一个“缺少单元格”的行。在我的例子中,我有一个DNS记录和其他字段,如firstseen
和lastseen
。lastseen
是每次看到该域时都会更新的字段,firstseen
在第一次出现后将保持不变。当我将ranged map reduce作业更改为一个简单的map reduce作业(使用所有时间数据)时,一切都很好(但该作业需要更长的时间才能完成)。
干杯!
问题内容: 我在数据库中有几个表。我想查找哪些列(在哪些表中)没有任何值(列中都为NULL)。在下面的示例中,结果应该是 我不知道如何创建这种查询。非常感谢您的帮助! 问题答案: 对于单列,返回不为null的行数: 您可以为所有列生成查询。根据Martin的建议,您可以使用排除不能为空的列。例如: 如果表的数量很大,则可以类似的方式为所有表生成查询。所有表的列表在中。
问题内容: 我想在Jenkins内部设置一些自动化功能,该功能会定期轮询github组织中的存储库列表,并根据作业模板为每个Git存储库自动设置一个jenkins作业。 实现这一目标的解决方案是什么?谢谢! 问题答案: 如今,Jenkins Pipeline是必经之路。 它使用定义管道,您可以将其签入您的存储库。 最佳实践是这样的文件 如文档中所述。
问题内容: 我阅读了如何使用Jenkins DSL设置作业超时。设置一项作业的超时时间。我想为所有作业设置它,并且设置略有不同:150%,平均超过10个作业,最多30分钟。 根据相关的job-dsl-plugin文档,我应该使用以下语法: 我在http://job-dsl.herokuapp.com/中进行了测试,这是相关的XML部分: 我使用之前手动编辑过的作业进行了验证,并且XML是正确的。因
本文向大家介绍列出所有Apache Kafka业务相关面试题,主要包含被问及列出所有Apache Kafka业务时的应答技巧和注意事项,需要的朋友参考一下 答:Apache Kafka的业务包括: 添加和删除Kafka主题 如何修改Kafka主题 如何关机 在Kafka集群之间镜像数据 找到消费者的位置 扩展您的Kafka群集 自动迁移数据 退出服务器 数据中心
问题内容: 我想检查所有值(即对应于字典中所有键的值)是否为0。是否有没有循环的方法?如果可以,怎么办? 问题答案: 用途: 如果给定的iterable的所有元素都为true,则返回。
问题内容: 我无法获得熊猫列的平均值或均值。有一个数据框。我在下面尝试的任何事情都没有给我该列的平均值 以下返回几个值,而不是一个: 这样: 问题答案: 如果您只想要列的均值,请选择列(这是一个系列),然后调用: