我在网上和“Effective Java”(Joshua Bloch 着)一书中看到了这个例子。
try(BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))){
writer.write(str); // do something with the file we've opened
}
catch(IOException e){
// handle the exception
}
Run Code Online (Sandbox Code Playgroud)
这个例子没有问题,BufferedWriter它会自动关闭,然后关闭FileWriter; 但是,在其他情况下,如果我们以这种方式声明 2 个嵌套资源:
try (AutoClosable res = new Impl2(new Impl1())) {... }
Run Code Online (Sandbox Code Playgroud)
我想可能会发生new Impl1()性能良好但new Impl2()崩溃的情况,在这种情况下,Java 将没有引用Impl1, 以关闭它。
像这样始终独立声明多个资源(即使在这种情况下不需要)难道不是更好的做法吗?
try(FileWriter fw = new FileWriter(fileName);
BufferedWriter writer = new BufferedWriter(fw)){ ... }
Run Code Online (Sandbox Code Playgroud) 这似乎很容易,但我无法成功.我有选择元素.我希望它们只显示我设置的值而不是默认值(或空值).
我怎样才能做到这一点?
我想在项目中使用Lombok来使用@Getter和@Setter.
我包括使用Maven:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.12.6</version>
<scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
Netbeans导入正常:
import lombok.Getter;
import lombok.Setter;
Run Code Online (Sandbox Code Playgroud)
但是自动设置器和getter不起作用(没有自动完成/"找不到符号......").
奇怪的是,对于另一个项目,我有它的工作正常!但我无法弄清楚这些差异.
我测试过:
更改lombok版本(甚至是最后一个):对于任何版本,导入都不再起作用
用Maven构建项目:没关系!
使用Eclipse:没关系!(但不幸的是,我是唯一一个决定的人)
=>所以我确定这是一个与Netbeans相关的问题
任何的想法 ?
我有一个带有以下代码的数据框:
def test(lat: Double, lon: Double) = {
println(s"testing ${lat / lon}")
Map("one" -> "one", "two" -> "two")
}
val testUDF = udf(test _)
df.withColumn("test", testUDF(col("lat"), col("lon")))
.withColumn("test1", col("test.one"))
.withColumn("test2", col("test.two"))
Run Code Online (Sandbox Code Playgroud)
现在检查日志,我发现每行UDF执行3次。如果我从“ test.three”列中添加“ test3”,则将再次执行UDF。
有人可以解释我为什么吗?
是否可以正确避免这种情况(即使添加了“测试”,也无需缓存数据框,即使这可行)?
我想使用 gitlab-ci 中的 buildah 来构建图像,从中运行容器并对其进行一些测试。
我当前的 gitlab-ci 是:
tests:
tags:
- docker
image: quay.io/buildah/stable
stage: test
variables:
STORAGE_DRIVER: "vfs"
BUILDAH_FORMAT: "docker"
BUILDAH_ISOLATION: "rootless"
only:
refs:
- merge_requests
changes:
- **/*
script:
- buildah info --debug
- buildah unshare docker/test/run.sh
Run Code Online (Sandbox Code Playgroud)
我的运行器是私有的 gitlab 运行器,我不想更改其配置(以免破坏其他 CI)。
run.sh的内容是:
#!/usr/bin/env bash
set -euo pipefail
container=$(buildah --ulimit nofile=8192 --name my-container from phusion/baseimage:bionic-1.0.0-amd64)
Run Code Online (Sandbox Code Playgroud)
错误是:
level=warning msg="error reading allowed ID mappings: error reading subuid mappings for user \"root\" and subgid mappings for group \"root\": No subuid ranges found …Run Code Online (Sandbox Code Playgroud) 将 Kafka 与 Java 库结合使用,我想禁用主题的自动创建(如果它尚不存在)。
有些网站说我应该将 auto.create.topics.enable 设置为 false,但这在 Java 中无法识别。
15:11:56.962 [main] WARN o.a.k.c.consumer.ConsumerConfig - The configuration 'auto.create.topics.enable' was supplied but isn't a known config.
Run Code Online (Sandbox Code Playgroud)
目前我将它作为环境变量放在我的 docker-compose 中:
KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'
Run Code Online (Sandbox Code Playgroud)
这可行,但我想由用户从 Java 管理它。
这可能吗?
使用具有以下配置的 Kafka/Java:
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, this.bootstrapServers);
props.put(ConsumerConfig.GROUP_ID_CONFIG, this.groupId);
props.put(ConsumerConfig.CLIENT_ID_CONFIG, UUID.randomUUID().toString());
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, this.maxPollRecords);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, keyDeserializerClass.getName());
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, valueDeserializerClass.getName());
props.put(ConsumerConfig.ISOLATION_LEVEL_CONFIG, IsolationLevel.READ_COMMITTED.toString().toLowerCase(Locale.ROOT));
Run Code Online (Sandbox Code Playgroud)
我有一个简单的轮询循环,如:
consumer.poll(Duration.ofMillis(200));
Run Code Online (Sandbox Code Playgroud)
我注意到一些奇怪的行为。持续时间为 0 时,它不返回任何结果。在本地,持续时间为 200 毫秒,我得到了一些结果,但在另一个生产环境中,它从不返回结果,至少需要 1 秒。
在我的理解中, poll 方法会等到它找到至少一个结果。持续时间为 0 时,至少应该返回已经到达的结果,而不应该总是不返回任何结果。
解释是什么?
使用角度和材料设计,我注意到,当您聚焦输入然后单击外部(没有什么特别的)时:
这在移动设备上真的很烦人,因为有一个聚焦的 md-autocomplete,虚拟键盘会向上滑动并占据可用高度的一半。并且没有办法隐藏它,除非点击另一个字段或按钮!
我真的不明白为什么移动设备不应该像桌面一样运行。当用户点击外部或选择一个元素时,有没有办法失去焦点?
我清楚地了解 Spark 如何将数据拆分到执行器内的分区,然后处理每个分区,然后聚合直到最终的“逻辑”数据帧。
但是使用Windows,我觉得每个窗口数据应该位于单个分区中,以便每个执行器在本地拥有所有数据?或者数据仍然被分割,然后通过某种魔法聚合?
此类窗口的一个示例是:
val window = Window
.partitionBy("partition-col")
.orderBy("order-col")
.rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)
myDF.withColumn("sum", sum("aCol").over(window))
Run Code Online (Sandbox Code Playgroud)
Spark 如何处理这个问题?使用windows的性能如何?
如果我处理一个窗口中的 50 列怎么办?它可能会产生大量的网络交换,还是每个窗口都会在本地处理?
我在 Spark 2.4.4 中使用带有大窗口的窗口函数,例如。
Window
.partitionBy("id")
.orderBy("timestamp")
Run Code Online (Sandbox Code Playgroud)
在我的测试中,我有大约 70 个不同的 ID,但我可能有大约 200 000 行 ID。如果没有进一步的配置,我必须为我的执行器分配大量内存以避免这种 OOM:
org.apache.spark.memory.SparkOutOfMemoryError: Unable to acquire 16384 bytes of memory, got 0
at org.apache.spark.memory.MemoryConsumer.throwOom(MemoryConsumer.java:157)
at org.apache.spark.memory.MemoryConsumer.allocateArray(MemoryConsumer.java:98)
at org.apache.spark.util.collection.unsafe.sort.UnsafeInMemorySorter.<init>(UnsafeInMemorySorter.java:128)
at org.apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter.<init>(UnsafeExternalSorter.java:161)
at org.apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter.create(UnsafeExternalSorter.java:128)
at org.apache.spark.sql.execution.ExternalAppendOnlyUnsafeRowArray.add(ExternalAppendOnlyUnsafeRowArray.scala:115)
at org.apache.spark.sql.execution.window.WindowExec$$anonfun$11$$anon$1.fetchNextPartition(WindowExec.scala:345)
at org.apache.spark.sql.execution.window.WindowExec$$anonfun$11$$anon$1.next(WindowExec.scala:371)
at org.apache.spark.sql.execution.window.WindowExec$$anonfun$11$$anon$1.next(WindowExec.scala:303)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage15.processNext(Unknown Source)
at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43)
at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$12$$anon$1.hasNext(WholeStageCodegenExec.scala:631)
at org.apache.spark.sql.execution.window.WindowExec$$anonfun$11$$anon$1.fetchNextRow(WindowExec.scala:314)
at org.apache.spark.sql.execution.window.WindowExec$$anonfun$11$$anon$1.<init>(WindowExec.scala:323)
at org.apache.spark.sql.execution.window.WindowExec$$anonfun$11.apply(WindowExec.scala:303)
at org.apache.spark.sql.execution.window.WindowExec$$anonfun$11.apply(WindowExec.scala:302)
at org.apache.spark.rdd.RDD$$anonfun$mapPartitions$1$$anonfun$apply$23.apply(RDD.scala:801)
at org.apache.spark.rdd.RDD$$anonfun$mapPartitions$1$$anonfun$apply$23.apply(RDD.scala:801)
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:49)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324)
Run Code Online (Sandbox Code Playgroud)
查看源代码,我发现了这个参数,根本没有记录:
spark.sql.windowExec.buffer.in.memory.threshold
Run Code Online (Sandbox Code Playgroud)
给它一个大的尺寸(例如1.000.000),我不再需要那么多的内存。据我了解,这是缓冲的行数;我想增加这个参数不会重复执行程序内存中的行,但这对我来说并不是很清楚。
有人可以准确地解释一下窗口是如何在执行器端处理的吗?为什么数据会重复?如何避免这种重复并使过程更快,每个窗口中有许多行?可以使用哪些参数?
谢谢。