小编omn*_*ist的帖子

在Java中,如何在不强制使用File作为媒介的情况下创建Apache Avro容器文件的等效文件?

如果有人熟悉Apache Avro的Java实现,那么这在黑暗中就是一个镜头.

我的高级目标是通过网络传输一些avro数据系列(例如,让我们说HTTP,但是特定协议对于此目的并不重要).在我的上下文中我有一个HttpServletResponse我需要以某种方式编写这些数据.

我最初尝试将数据写为avro容器文件的虚拟版本(假设"response"的类型为HttpServletResponse):

response.setContentType("application/octet-stream");
response.setHeader("Content-transfer-encoding", "binary");
ServletOutputStream outStream = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(outStream);

Schema someSchema = Schema.parse(".....some valid avro schema....");
GenericRecord someRecord = new GenericData.Record(someSchema);
someRecord.put("somefield", someData);
...

GenericDatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(someSchema);
DataFileWriter<GenericRecord> fileWriter = new DataFileWriter<GenericRecord>(datumWriter);
fileWriter.create(someSchema, bos);
fileWriter.append(someRecord);
fileWriter.close();
bos.flush();
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但是事实证明Avro并没有提供一种方法来读取除实际文件之外的容器文件:DataFileReader只有两个构造函数:

public DataFileReader(File file, DatumReader<D> reader);
Run Code Online (Sandbox Code Playgroud)

public DataFileReader(SeekableInput sin, DatumReader<D> reader);
Run Code Online (Sandbox Code Playgroud)

其中SeekableInput是一些特定于avro的自定义表单,其创建也最终从文件中读取.现在给出,除非有某种方法以某种方式将InputStream强制转换为文件(http://stackoverflow.com/questions/578305/create-a-java-file-object-or-equivalent-using-a-byte- array-in-memory-without-a表明没有,我也试过查看Java文档),如果OutputStream另一端的阅读器收到该avro容器文件,这种方法将无效(我不确定为什么他们允许一个人将avro二进制容器文件输出到任意OutputStream,而没有提供从另一端的相应InputStream读取它们的方法,但这不是重点.似乎容器文件阅读器的实现需要具体文件提供的"可搜索"功能.

好的,所以看起来这种方法看起来不像我想做的那样.如何创建模仿avro容器文件的JSON响应?

public static Schema WRAPPER_SCHEMA = Schema.parse(
  "{\"type\": \"record\", " +
   "\"name\": \"AvroContainer\", " +
   "\"doc\": \"a JSON avro container …
Run Code Online (Sandbox Code Playgroud)

java serialization avro

18
推荐指数
1
解决办法
5404
查看次数

何时在bash中导出环境变量时使用括号?

我一直试图弄清楚bash环境变量中括号的用途是什么.例如,在下面的代码示例中,为什么有些定义使用了{} aroudn PATH,例如export ... = .../$ {PATH}.还要注意一些定义是不同的:有些定义使用{$ ECLIPSE_DIR}和括号内的$; 有些人使用$ {PATH}和括号外的$,有些省略括号.这段代码通常有效,虽然有时会显示底部显示的错误(它们似乎是短暂的),但我不确定为什么这些错误只会出现在有时而不是其他错误上.

有关包含bash环境变量的方法的常见做法是什么,何时应该使用括号,以及将$放在括号内外有什么区别?另外,为什么有些行在变量名之前有"导出",有些则没有?这有什么区别?

# ECLIPSE
ECLIPSE_DIR=$HOME/eclipse
PATH=${PATH}:{$ECLIPSE_DIR}

# ANT
ANT_HOME=/usr/bin/ant
PATH=${ANT_HOME}/bin:${PATH}
export ANT_HOME PATH

# GRADLE
export GRADLE_HOME=/usr/local/gradle
export PATH=$GRADLE_HOME/bin:$PATH</code>
Run Code Online (Sandbox Code Playgroud)


-bash: export: `/usr/bin/ant/bin:/usr/local/bin:{/Users/me/eclipse}:/usr/bin/scala-2.9.0.1/bin:/usr/local/mysql/bin:/usr/local/bin:{/Users/me/eclipse}': not a valid identifier
Run Code Online (Sandbox Code Playgroud)

bash environment-variables

10
推荐指数
1
解决办法
3202
查看次数

在Java中,在Map中使用Set作为键时应该采取什么预防措施?

我不确定在地图中使用动态对象(如集合作为键)的主流观点是什么.

我知道典型的Map实现(例如,HashMap)使用哈希码来决定将条目放入哪个桶,并且如果该哈希码应该以某种方式改变(可能因为Set的内容应该改变,那么那可能会弄乱)通过导致错误地计算存储桶来启动HashMap(与Set最初插入HashMap的方式相比).

但是,如果我确保Set内容根本没有变化,那么这是否可行?即便如此,这种方法通常被认为是容易出错的,因为集合具有固有的易变性(即使采取了预防措施以确保它们不被修改)?

看起来Java允许将函数参数指定为final; 这可能是一个可以采取的一个小小的预防措施?

人们甚至在商业/开源实践中做这样的事情吗?(将List,Set,Map等作为键放在地图中?)

我想我应该用这个来描述我想要完成的事情,这样动机就会变得更加清晰,也许可以提出其他实施方案.

我想要完成的是拥有这样的东西:

class TaggedMap<T, V> {
  Map<Set<T>, V> _map;
  Map<T, Set<Set<T>>> _keys;
}
Run Code Online (Sandbox Code Playgroud)

......本质上,能够用某些键(T)"标记"某些数据(V)并写入其他辅助功能来访问/修改数据并用它做其他奇特的东西(即返回所有条目的列表)满足一些关键标准)._keys的功能是作为一种索引,以便于查找值而无需遍历所有_map的条目.

在我的情况下,我打算专门使用T = String,V = Integer.我与之交谈的人建议用字符串代替Set,即:

class TaggedMap<V> {
  Map<String, V> _map;
  Map<T, Set<String>> _keys;
}
Run Code Online (Sandbox Code Playgroud)

其中_map中的键的类型为"key1; key2; key3",其中键由分隔符分隔.但我想知道我是否可以完成一个更通用的版本,而不是必须在键之间强制使用带分隔符的String.

我想知道的另一件事是,是否有某种方法可以将其作为Map扩展.我想象的是:

class TaggedMap<Set<T>, V> implements Map<Set<T>, V> {
  Map<Set<T>, V> _map;
  Map<T, Set<Set<T>>> _keys;
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法将其编译,可能是由于我对泛型的理解较差.以此作为目标,任何人都可以修复上述声明,以便它根据我所描述的精神工作或建议一些轻微的结构修改?特别是,我想知道"implements Map,V>"子​​句,是否可以声明这样一个复杂的接口实现.

java map set

9
推荐指数
1
解决办法
509
查看次数

标签 统计

java ×2

avro ×1

bash ×1

environment-variables ×1

map ×1

serialization ×1

set ×1