Ck(三) 灵活批量写入大量数据至多张集群表

一、前言

今天有一个批量写入多张集群表数据的任务。要求集群每个节点都要写入一定数据。于是我多花了几个小时,写了一个灵活的批量写入代码。以后再有类似任务可以直接拿来用。经测试是没问题的,但是细节可能写的不好。有空再改。

主要解决问题:Clickhouse批量写入多个节点数据。

二、开始

1、首先是Clickhouse的数据源初始化。正常使用是考虑使用BalancedClickhouseDataSource,但是我想代码控制写入数据量的均匀,所以使用的ClickHouseDataSource。

public class ClickhouseDataSource {

    private volatile static List<DataSource> sources = null;

    public static List<DataSource> getDataSource() {
        if (sources == null) {
            synchronized (ClickhouseDataSource.class) {
                if (sources == null) {
                    List<DataSource> result = Lists.newArrayList();
                    List<Map<String, Object>> collect = ConfigUtils.getConfig().getList("store.clickhouse.connect").stream().map(configValue -> (Map<String, Object>) configValue.unwrapped())
                            .collect(Collectors.toList());
                    List<String> urlList = collect.stream().map(node -> (String) node.get("connection-url")).collect(Collectors.toList());
                    Map<String, Object> unwrapped = (Map<String, Object>) ConfigUtils.getConfig().getValue("store.clickhouse.param").unwrapped();
                    ClickHouseProperties ckProperties = new ClickHouseProperties();
                    ckProperties.setMaxBlockSize(80000 * 1000);
                    ckProperties.setMaxMemoryUsage(300000000000L);
                    ckProperties.setMaxTotal(1000);
                    ckProperties.setUseServerTimeZone(false);
                    ckProperties.setUseServerTimeZoneForDates(false);
                    ckProperties.setUseTimeZone((String) unwrapped.get("zone"));
                    ckProperties.setDefaultMaxPerRoute(500);
                    ckProperties.setConnectionTimeout(1500 * 1000);
                    ckProperties.setKeepAliveTimeout(-1);
                    ckProperties.setSocketTimeout(Integer.MAX_VALUE);
                    //ckProperties.setUser((String) unwrapped.get("user"));
                    //ckProperties.setPassword((String) unwrapped.get("password"));
                    sources = Lists.newArrayList();
                    for (String url : urlList) {
                        DataSource ds = new ClickHouseDataSource(url, ckProperties);
                        sources.add(ds);
                    }

                }
            }
        }
        return sources;
    }
}

2、ck 批量写入。将数据转成TSV后写入。ClickhouseDao中通过dbName和tableName查询system.columns来获得列的名称和类型。即知道类型那么即可根据类型来模拟数据

public class BatchStringHttpEntity extends AbstractHttpEntity {

    private List<String> batchRows;
    public static final String NULL = "\\N";

    public BatchStringHttpEntity(List<String> batchRows) {
        this.batchRows = batchRows;
    }

    @Override
    public boolean isStreaming() {
        return false;
    }

    @Override
    public boolean isRepeatable() {
        return true;
    }

    @Override
    public long getContentLength() {
        return -1;
    }

    @Override
    public InputStream getContent() throws IOException, IllegalStateException {
        throw new UnsupportedOperationException();
    }

    @Override
    public void writeTo(OutputStream outputStream) throws IOException {
        for (String row : batchRows) {
            outputStream.write(row.getBytes(StreamUtils.UTF_8));
        }
    }
}
@Slf4j
public class ClickhouseDao {

    private DataSource dataSource;
    public ClickhouseDao(DataSource dataSourc
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: ck情识别数据集是一个广泛应用于计算机视觉领域的数据集,用于情感识别和情分类任务。数据集包含了来自不同人的面部情图像,涵盖了7种不同的情感或情类别,即“生气”、“厌恶”、“恐惧”、“高兴”、“伤心”、“惊讶”和“中立”。 数据分布是指按照不同类别或情感对数据进行统计和分布的一张格。在ck情识别数据集的数据分布中,每一列代一种情感类别,每一行代一个样本。中的元素示对应样本是否属于对应情感类别,通常用二进制示,1示属于,0示不属于。 在ck情识别数据集的数据分布中,可以统计每一类情感所占的比例,即每个类别下的样本数量占总样本数量的比例。通过观察数据分布,我们可以了解到每个情感类别的数据量是否平衡,是否存在样本数量过少或过多的情况。 这样的数据分布信息对于训练和评估基于ck数据集的情分类模型非常重要。如果某个情感类别的数据量过少,可能导致模型对该类别的分类效果不佳。因此,可以根据数据分布的信息,对数据集进行采样或调整,使得各个情感类别的数据量相对均衡,从而提高模型的泛化能力和识别准确率。 总而言之,ck情识别数据集的数据分布展示了数据集中不同情感类别的样本数量和分布情况,帮助我们了解和调整数据集,从而提高情识别模型的性能。 ### 回答2: ck 情识别数据集是用于进行情绪识别的一个研究数据集,其中包含了来自于13位志愿者的情图像,共计327个样本。这些样本涵盖了包括快乐、悲伤、厌恶、惊讶、愤怒和恐惧等六种不同的情绪。 数据分布将这些样本按照情绪类别进行了分类,并统计了每个情绪类别中样本的数量。根据数据分布,可以清晰地了解到每种情绪类别的样本数量以及相对比例。 通过对数据分布的分析,我们可以发现一些有趣的事实。首先,快乐和悲伤是数据集中最常见的两种情绪,分别占据了样本总数的30%和23%。而相对而言,恐惧是样本数量最少的情绪,仅占据了总数的5%。这些数据反映出了这些情绪在日常生活中的普遍程度。 其次,我们可以进一步观察各种情绪类别的变化趋势。例如,愤怒和厌恶在数据集中的数量相对较少,这可能与这两种情绪往往相对较为稀少有关。而惊讶在数据集中的数量较为均衡,说明这种情绪在样本中普遍存在。 最后,在进行模型训练和测试时,我们可以根据数据分布的信息来调整样本的处理方式。例如,如果我们希望模型更好地识别恐惧情绪,可以通过数据增强技术增加恐惧情绪的样本数目,以增加模型在这一类别的训练效果。 综上所述,ck 情识别数据集的数据分布提供了样本分布情况的详细信息,它对于研究人员们进行情绪识别研究以及模型优化都具有重要指导意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值