gitweixin
  • 首页
  • 小程序代码
    • 资讯读书
    • 工具类
    • O2O
    • 地图定位
    • 社交
    • 行业软件
    • 电商类
    • 互联网类
    • 企业类
    • UI控件
  • 大数据开发
    • Hadoop
    • Spark
    • Hbase
    • Elasticsearch
    • Kafka
    • Flink
    • 数据仓库
    • 数据挖掘
    • flume
    • Kafka
    • Hive
    • shardingsphere
    • solr
  • 开发博客
    • Android
    • php
    • python
    • 运维
    • 技术架构
    • 数据库
  • 程序员网赚
  • bug清单
  • 量化投资
  • 在线查询工具
    • 去行号
    • 在线时间戳转换工具
    • 免费图片批量修改尺寸在线工具
    • SVG转JPG在线工具

分类归档大数据开发

精品微信小程序开发门户,代码全部亲测可用

  • 首页   /  
  • 分类归档: "大数据开发"
  • ( 页面28 )
neo4j 5月 11,2021

Neo4j批量插入Java API实例

@Component
public class DatabaseBatchSaveUtil {

    private final static Logger LOGGER = LoggerFactory.getLogger(DatabaseBatchSaveUtil.class);

    private final static String NEO4j_GET_CURRENT_TIME_FUNCTION = "apoc.date.format(timestamp(),\\\"ms\\\",\\\"yyyy-MM-dd HH:mm:ss\\\",\\\"CTT\\\")";

    public static void batchSaveNodeFromDatabase(String jdbcConnectString, String sql, BaseNode baseNode, Map<String, String> columnMap) {
        try {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("call apoc.periodic.iterate('call apoc.load.jdbc(\\\"").append(jdbcConnectString).append("\\\",\\\"").append(sql).append("\\\")', '");
            stringBuilder.append("merge (a:").append(baseNode.typeGetter()).append("{").append(baseNode.uniqueFieldNameGetter()).append(":").append("row.").append(columnMap.get(baseNode.uniqueFieldNameGetter()));
            if (baseNode instanceof CarNode) {
                stringBuilder.append(",vehicleCodeType:row.vehicleCodeTypeStr");
            }
            stringBuilder.append("}) ").append("set ");
            columnMap.forEach((neo4jColumn, dbColumn) -> stringBuilder.append("a.").append(neo4jColumn).append(" = row.").append(dbColumn).append(","));
            if (columnMap.containsKey("updateTime"))
                stringBuilder.deleteCharAt(stringBuilder.length() - 1);
            else stringBuilder.append("a.updateTime = ").append(NEO4j_GET_CURRENT_TIME_FUNCTION);
            stringBuilder.append("' ").append(",{batchSize:1000,iterateList:true})");

            LocalDateTime startTime = LocalDateTime.now();
            CyberQueryExecuteUtil.executeBatchUpdateQuery(stringBuilder.toString());

            LOGGER.info("Save node: {} from database {}, cost {} second", baseNode.typeGetter(), jdbcConnectString, Duration.between(startTime, LocalDateTime.now()).getSeconds());

            Thread.sleep(20000);
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
        }
    }

    public static void batchSaveRelationFromDatabase(String jdbcConnectString, String sql, BaseRelation baseRelation, Map<String, String> columnMap) {
        try {
            BaseNode startNode = baseRelation.getStartNode();
            BaseNode endNod = baseRelation.getEndNode();

            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("call apoc.periodic.iterate('call apoc.load.jdbc(\\\"").append(jdbcConnectString).append("\\\",\\\"").append(sql).append("\\\")', '");

            stringBuilder.append("merge (n:").append(startNode.typeGetter()).append("{").append(startNode.uniqueFieldNameGetter()).append(":").append("row.").append(columnMap.get("startNode"));
            if (startNode instanceof CarNode) {
                stringBuilder.append(",vehicleCodeType:row.vehicleCodeTypeStr");
            }
            stringBuilder.append("}) with * ");

            stringBuilder.append("merge (m:").append(endNod.typeGetter()).append("{").append(endNod.uniqueFieldNameGetter()).append(":").append("row.").append(columnMap.get("endNode"));
            if (endNod instanceof CarNode) {
                stringBuilder.append(",vehicleCodeType:row.vehicleCodeTypeStr2");
            }
            stringBuilder.append("}) with * ");

            stringBuilder.append("merge (n)-[r:").append(baseRelation.getType());
            if (columnMap.containsKey("startTime") || columnMap.containsKey("endTime")) {
                stringBuilder.append("{");
                if (columnMap.containsKey("startTime"))
                    stringBuilder.append("startTime:row.").append(columnMap.get("startTime")).append(",");

                if (columnMap.containsKey("endTime"))
                    stringBuilder.append("endTime:row.").append(columnMap.get("endTime"));
                else stringBuilder.deleteCharAt(stringBuilder.length() - 1);

                stringBuilder.append("}");
            }
            stringBuilder.append("]-(m)");

            columnMap.remove("startNode");
            columnMap.remove("endNode");

            if (!columnMap.isEmpty()) {
                stringBuilder.append(" set  ");
                columnMap.forEach((neo4jColumn, dbColumn) -> stringBuilder.append("r.").append(neo4jColumn).append(" = row.").append(dbColumn).append(","));
                if (columnMap.containsKey("updateTime"))
                    stringBuilder.deleteCharAt(stringBuilder.length() - 1);
                else stringBuilder.append("r.updateTime = ").append(NEO4j_GET_CURRENT_TIME_FUNCTION);
            }

            stringBuilder.append("' ").append(",{batchSize:1000,iterateList:true})");

            LocalDateTime startTime = LocalDateTime.now();
            CyberQueryExecuteUtil.executeBatchUpdateQuery(stringBuilder.toString());

            LOGGER.info("Save relation: {} from database {}, cost {} second", baseRelation.getType(), jdbcConnectString, Duration.between(startTime, LocalDateTime.now()).getSeconds());

            Thread.sleep(20000);
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
        }
    }
}
作者 east
neo4j 5月 9,2021

Neo4j增删改查Java API实例

@Component
public class QueryDao {
    private static final Logger LOGGER = LoggerFactory.getLogger(StatisticDao.class);

    public List<BaseNode> queryNodeByPage(BaseNode baseNode, LocalDateTime lastTime, long pageNum, int pageSize) {
        long skip = pageNum * pageSize;
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("MATCH (n:").append(baseNode.typeGetter());
        if (StringUtils.hasText(baseNode.uniqueValueGetter()))
            stringBuilder.append("{").append(baseNode.uniqueFieldNameGetter()).append(": '").append(baseNode.uniqueValueGetter()).append("'}");
        stringBuilder.append(") ");
        if (null != lastTime)
            stringBuilder.append("WHERE n.updateTime is null OR n.updateTime <= '").append(lastTime.format(Constant.NORMAL_TIME_FORMATTER)).append("' ");
        stringBuilder.append("RETURN n SKIP ").append(skip).append(" LIMIT ").append(pageSize);
        return Lists.newArrayList(CyberQueryExecuteUtil.executeEntityQuery(stringBuilder.toString(), BaseNode.class));
    }

    public List<BaseNode> queryNodeByUniqueValue(BaseNode entity) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("MATCH (n:").append(entity.typeGetter()).append("{").append(entity.uniqueFieldNameGetter()).append(": '");
        if (entity instanceof CarNode) {
            String[] carArray = entity.uniqueValueGetter().split(Constant.carNoTypeSplit);
            stringBuilder.append(carArray[0]).append("'");
            if (1 < carArray.length) {
                stringBuilder.append(",vehicleCodeType:'");
                if (2 > carArray[1].length()) stringBuilder.append("0");
                stringBuilder.append(carArray[1]).append("'");
            }
        } else stringBuilder.append(entity.uniqueValueGetter()).append("'");
        stringBuilder.append("}) RETURN n");
        return Lists.newArrayList(CyberQueryExecuteUtil.executeEntityQuery(stringBuilder.toString(), BaseNode.class));
    }

    public boolean isNodeExistAndFreshLastWeek(BaseNode entity) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("MATCH (n:").append(entity.typeGetter());
        stringBuilder.append("{").append(entity.uniqueFieldNameGetter()).append(": '").append(entity.uniqueValueGetter()).append("'");
        if (entity instanceof CarNode) {
            CarNode carNode = (CarNode) entity;
            if (StringUtils.hasText(carNode.getVehicleCodeType()))
                stringBuilder.append(",vehicleCodeType:'").append(carNode.getVehicleCodeType()).append("'");
        }
        stringBuilder.append("}) WHERE n.updateTime >= '")
                .append(LocalDateTime.now().minusDays(7L).format(Constant.NORMAL_TIME_FORMATTER)).append("' RETURN count(n)");
        Long count = CyberQueryExecuteUtil.executeCountQuery(stringBuilder.toString());
        return 1L <= count;
    }

    public List<BaseRelation> queryEndNodeByStartNodeAndRelationType(BaseNode entity, BaseRelation relationship, BaseNode baseNode) {
        StringBuilder stringBuilder = createBaseCQL(entity, relationship, baseNode);
        stringBuilder.append("RETURN n,m,r");
        return Lists.newArrayList(CyberQueryExecuteUtil.executeEntityQuery(stringBuilder.toString(), relationship.getClass()));
    }

    public List<BaseRelation> queryEndNodeByStartNodeAndRelationType(BaseNode entity, BaseRelation relationship, BaseNode baseNode, LocalDateTime startTime, LocalDateTime endTime) {
        StringBuilder stringBuilder = createBaseCQL(entity, relationship, baseNode);
        stringBuilder.append("WHERE 1=1 ");
        if (null != startTime)
            stringBuilder.append("AND r.startTime > '").append(startTime.format(Constant.NORMAL_TIME_FORMATTER)).append("' ");
        if (null != endTime)
            stringBuilder.append("AND r.endTime < '").append(endTime.format(Constant.NORMAL_TIME_FORMATTER)).append("' ");
        stringBuilder.append("RETURN n,m,r");
        return Lists.newArrayList(CyberQueryExecuteUtil.executeEntityQuery(stringBuilder.toString(), relationship.getClass()));
    }

    public List<BaseRelation> queryRelationByStartNode(BaseNode entity, BaseRelation relationship, BaseNode baseNode) {
        StringBuilder stringBuilder = createBaseCQL(entity, relationship, baseNode);
        stringBuilder.append("WHERE r.joinCount IS NOT NULL ");
        if (null != relationship.getStartTime())
            stringBuilder.append("AND r.startTime > '").append(relationship.getStartTime().format(Constant.NORMAL_TIME_FORMATTER)).append("' ");
        if (null != relationship.getEndTime())
            stringBuilder.append("AND r.endTime < '").append(relationship.getEndTime().format(Constant.NORMAL_TIME_FORMATTER)).append("' ");
        stringBuilder.append("RETURN n,m,r ");
        stringBuilder.append("ORDER BY r.joinCount DESC, r.confidence DESC LIMIT 10");
        return Lists.newArrayList(CyberQueryExecuteUtil.executeEntityQuery(stringBuilder.toString(), relationship.getClass()));
    }

   
    public List<Map<String, Object>> statisticFollowHistory(BaseNode entity, BaseNode baseNode, boolean last3Day) {
        StringBuilder stringBuilder = createBaseCQL(entity, FollowRelation.builder().build(), baseNode);
        if (last3Day)
            stringBuilder.append("WHERE r.endTime >= '")
                    .append(LocalDate.now().minusDays(3L).atStartOfDay().format(Constant.NORMAL_TIME_FORMATTER))
                    .append("' ");
        stringBuilder.append("WITH n,m,");
        stringBuilder.append("SUM(r.joinCount)");
        //stringBuilder.append(last3Day ? "SUM(r.joinCount)" : "COUNT(r)");
        stringBuilder.append(" AS r_count RETURN n,m,r_count ORDER BY r_count DESC LIMIT 5");
        return CyberQueryExecuteUtil.executeOriginResultQuery(stringBuilder.toString());
    }

    public List<FollowRelation> queryLatestByStartNode(BaseNode entity, BaseNode baseNode) {
        StringBuilder stringBuilder = createBaseCQL(entity, FollowRelation.builder().build(), baseNode);
        stringBuilder.append("RETURN n,m,r ORDER BY r.endTime DESC LIMIT 5");
        return Lists.newArrayList(CyberQueryExecuteUtil.executeEntityQuery(stringBuilder.toString(), FollowRelation.class));
    }

    private StringBuilder createBaseCQL(BaseNode entity, BaseRelation relationship, BaseNode baseNode) {
        StringBuilder stringBuilder = new StringBuilder("MATCH ");
        stringBuilder.append("(n:").append(entity.typeGetter()).append("{").append(entity.uniqueFieldNameGetter()).append(": '").append(entity.uniqueValueGetter()).append("'");
        if (entity instanceof CarNode) {
            CarNode carNode = (CarNode) entity;
            if (StringUtils.hasText(carNode.getVehicleCodeType()))
                stringBuilder.append(",vehicleCodeType:'").append(carNode.getVehicleCodeType()).append("'");
        }
        stringBuilder.append("})");
        stringBuilder.append("-");
        stringBuilder.append("[r:").append(relationship.getType()).append("]");
        stringBuilder.append("-");
        stringBuilder.append("(m:").append(baseNode.typeGetter()).append(") ");
        return stringBuilder;
    }
}
/**
 * @author Ricardo.H.Wu
 * @time 2020/8/3 11:04
 */
@Data
public abstract class BaseNode {

    @Id
    @GeneratedValue
    private Long id;

    @Convert(Neo4jLocalDateTimeConvert.class)
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime = LocalDateTime.now();

    public abstract String typeGetter();

    public abstract String uniqueFieldNameGetter();

    public abstract String uniqueValueGetter();

    public abstract void uniqueValueSetter(String uniqueValue);

    public DtoNeo4jNode convertToResponseEntity() {
        return DtoNeo4jNode.builder()
                .label(typeGetter())
                .id(uniqueValueGetter())
                .data(this)
                .build();
    }
}

@Data
public abstract class BaseRelation {

@Id
@GeneratedValue
private Long id;

@StartNode
private BaseNode startNode;

@EndNode
private BaseNode endNode;

@Convert(Neo4jLocalDateTimeConvert.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;

@Convert(Neo4jLocalDateTimeConvert.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;

@Convert(Neo4jLocalDateTimeConvert.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime = LocalDateTime.now();

public abstract String getType();

public abstract DtoNeo4jEdge convertToResponseEntity();

}

作者 east
neo4j 5月 8,2021

Neo4j封装的基础查询Java API

import com.alibaba.fastjson.JSON;
import com.google.common.base.Throwables;
import com.google.common.collect.Lists;
import org.neo4j.ogm.model.QueryStatistics;
import org.neo4j.ogm.model.Result;
import org.neo4j.ogm.session.Session;
import org.neo4j.ogm.session.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Component
public class CyberQueryExecuteUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(CyberQueryExecuteUtil.class);

    private static SessionFactory SESSION_FACTORY;

    @Autowired
    public void init(SessionFactory sessionFactory) {
        SESSION_FACTORY = sessionFactory;
    }

    /**
     * 执行统计方法
     *
     * @param cql cypher查询语句
     * @return 统计结果
     */
    public static Long executeCountQuery(String cql) {
        try {
            Session session = SESSION_FACTORY.openSession();
            Long count = session.queryForObject(Long.class, cql, new HashMap<>());
            session.clear();
            LOGGER.debug("Neo4j cypher query: [{}], result: [{}]", cql, count);
            return count;
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
            return 0L;
        }
    }

    /**
     * 执行实体查询方法
     *
     * @param cql       cypher查询语句
     * @param className 实体类型
     * @return 查询结果
     */
    public static <T> Iterable<T> executeEntityQuery(String cql, Class<T> className) {
        try {
            Session session = SESSION_FACTORY.openSession();
            Iterable<T> response = session.query(className, cql, new HashMap<>());
            session.clear();
            LOGGER.debug("Neo4j cypher query: [{}]", cql);
            return response;
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
            return new ArrayList<>();
        }
    }

    /**
     * 执行实体查询方法
     *
     * @param cql cypher查询语句
     * @return 查询原始结果
     */
    public static List<Map<String, Object>> executeOriginResultQuery(String cql) {
        try {
            Session session = SESSION_FACTORY.openSession();
            Result response = session.query(cql, new HashMap<>());
            session.clear();
            LOGGER.debug("Neo4j cypher query: [{}], status: [{}]", cql, JSON.toJSONString(response.queryStatistics()));
            return Lists.newArrayList(response.queryResults());
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
            return new ArrayList<>();
        }
    }

    /**
     * 执行neo4j更新语句
     *
     * @param cql cypher更新语句
     */
    public static void executeUpdateQuery(String cql) {
        try {
            Session session = SESSION_FACTORY.openSession();
            Result result = session.query(cql, new HashMap<>());
            QueryStatistics queryStatistics = result.queryStatistics();
            session.clear();
            LOGGER.debug("Neo4j execute cql: [{}] contain update:[{}], status: [{}]", cql, queryStatistics.containsUpdates(), JSON.toJSON(queryStatistics));
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
        }
    }

    /**
     * 执行neo4j批量更新语句
     *
     * @param cql cypher批量更新语句
     */
    public static void executeBatchUpdateQuery(String cql) {
        try {
            Session session = SESSION_FACTORY.openSession();
            Result result = session.query(cql, new HashMap<>());
            QueryStatistics queryStatistics = result.queryStatistics();
            session.clear();
            LOGGER.debug("Neo4j batch save cql: [{}] contain update:[{}], status: [{}]", cql, queryStatistics.containsUpdates(), JSON.toJSON(queryStatistics));
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
        }
    }

    /**
     * 执行neo4j批量更新语句
     *
     * @param cql cypher批量更新语句
     */
    public static void executeBatchUpdateQuery(String cql, Map<String, Object> param) {
        try {
            Session session = SESSION_FACTORY.openSession();
            Result result = session.query(cql, param);
            QueryStatistics queryStatistics = result.queryStatistics();
            session.clear();
            LOGGER.debug("Neo4j batch save cql: [{}] contain update:[{}], status: [{}]", cql, queryStatistics.containsUpdates(), JSON.toJSON(queryStatistics));
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
        }
    }
}
作者 east
大数据开发 5月 4,2021

大数据即席查询框架技术选型

目前应用比较广泛的几种即席查询框架有Druid、Kylin、Presto、Impala、Spark SQL和Elasticsearch,针对响应时间、数据支持、技术特点等方面的对比如表

针对上表的对比情况,分析汇总如下。

● Druid:实时处理时序数据的OLAP数据库,因为它的索引首先按照时间进行分片,查询的时候也是按照时间线去路由索引的。

● Kylin:核心是Cube,Cube是一种预计算技术,基本思路是预先对数据进行多维索引,查询时只扫描索引而不访问原始数据,从而提高查询速度。

● Presto:它没有使用MapReduce,大部分场景下比Hive快一个数量级,其中的关键是所有的处理都在内存中完成。

● Impala:基于内存运算,速度快,支持的数据源没有Presto多。

● Spark SQL:基于Spark平台上的一个OLAP框架,基本思路是增加机器以实现并行计算,从而提高查询速度。

● Elasticsearch:最大的特点是使用倒排索引解决了索引存在的问题。根据研究,Elasticsearch在数据获取和聚集时用的资源比在Druid中高。框架选型如下。

● 从超大数据的查询效率来看:Druid > Kylin > Presto >Spark SQL。

● 从支持的数据源种类来看:Presto > Spark SQL > Kylin >Druid。

作者 east
数据仓库 5月 2,2021

数据仓库分层及命名规则

数据仓库中的数据要想真正发挥最大的作用,必须对数据仓库进行分层,数据仓库分层的优点如下。

● 把复杂问题简单化。可以将一个复杂的任务分解成多个步骤来完成,每层只处理单一的步骤。

● 减少重复开发。规范数据分层,通过使用中间层数据,可以大大减少重复计算量,增加计算结果的复用性。

● 隔离原始数据。使真实数据与最终统计数据解耦。数据仓库具体如何分层取决于设计者对数据仓库的整体规划,不过大部分的思路是相似的。

本数据仓库分为五层,如下所述。

● ODS层:原始数据层,存放原始数据,直接加载原始日志、数据,数据保持原貌不做处理。

● DWD层:明细数据层,对ODS层数据进行清洗(去除空值、脏数据、超过极限范围的数据)、维度退化、脱敏等。

● DWS层:服务数据层,以DWD层的数据为基础,按天进行轻度汇总。

● DWT层:主题数据层,以DWS层的数据为基础,按主题进行汇总,获得每个主题的全量数据表。

● ADS层:数据应用层,面向实际的数据需求,为各种统计报表提供数据。数据仓库分层后要遵守一定的数据仓库命名规范,本项目中的规范如下。

1.表命名ODS层命名为ods_表名。

DWD层命名为dwd_dim/fact_表名。DWS层命名为dws_表名。

DWT层命名为dwt_购物车。ADS层命名为ads_表名。临时表命名为tmp_×××。用户行为表以.log为后缀。

2.脚本命名脚本命名格式为数据源to目标_db/log.sh。用户行为需求相关脚本以.log为后缀;业务数据需求相关脚本以.db为后缀。

作者 east
数据仓库 4月 28,2021

关系型数据库(关系模型)转变为数据仓库(维度模型)示例

关系模型示意如图1所示,严格遵循第三范式(3NF)。从图1中可以看出,模型较为松散、零碎,物理表数量多,但数据冗余程度低。由于数据分布于众多的表中,因此这些数据可以更为灵活地被应用,功能性较强。关系模型主要应用于OLTP中,为了保证数据的一致性及避免冗余,大部分业务系统的表都是遵循第三范式的。

维度模型示意如图2所示,其主要应用于OLAP中,通常以某一张事实表为中心进行表的组织,主要面向业务,其特征是可能存在数据的冗余,但用户能方便地得到数据。关系模型虽然数据冗余程度低,但在大规模数据中进行跨表分析、统计、查询时,会造成多表关联,这会大大降低执行效率。所以通常我们采用维度模型建模,把各种相关表整理成事实表和维度表两种。所有的维度表围绕事实表进行解释。

图1 关系模型示意
图2 维度模型示意
作者 east
大数据开发 3月 29,2021

FusionInsight HD客户端使用kerberos安全认证遇到坑

之前成功安装过一个华为FusionInsight HD的客户端,Hbase、Spark等都使用正常。由于项目需要,又在新的服务器安装新的 FusionInsight HD 客户端,没想到这次遇到很多坑。

重新找了一个新版本的 FusionInsight HD的客户端 。安装成功后,进行安装认证

kinit myAccount

提示:Client myAccount@hadoop.com not found in Kerberos database while getting inital credentials。

但如果 kinit admin,就不会出现上面的问题。

经过各种折腾,和服务同步时间,关闭防火墙,查找hosts是否修改正确,jdk版本是否兼容,以及配置是否正确。卸载HD客户端和重新安装。上面的错误消失了,但又出现各种奇奇怪怪问题,例如下面的:

Not attempting to re-login since the last re-login was attempted less than 600 seconds before

GSS inititate failed

运行Spark程序又遇到种种问题

Couldn’t bind no a random free port

Connection refused

Conn’t setup connection for hdfs/myAccount@hadoop.com

刚开始没有怀疑这个HD客户端的问题,总是以为自己没配置好,或者是HD集群的服务器需要把这个ip或账号加入名单,反复折腾了好久。跟之前安装正常的HD集群各种对比,除了版本不一样,别的都找不到有什么区别。甚至在这台安装正常的服务器重新装新的HD客户端,也是安全认证不了。

后来觉得,有可能是客户端问题,要重新找回之前版本或新版本HD客户端,果然装了一个最新版本HD客户端安全认证成功了,怀疑之前安全认证不成功的,可能是装了测试集群或测试版本的。没有myAccount这个账户,但是测试集群也有admin这个账户。

由于对原理等理解不透彻,网上遇到同类问题的人也少,出现问题先入为主,以为自己没配置好,好几次看到HD客户端和之前版本不一样,也没有怀疑到这方面上去。

作者 east
Java 3月 16,2021

空间地理算法工具类

空间地理,常常需要计算2个地址是否是同个地址,2个坐标之间的直线距离。下面把这些常用算法进行封装。 2个地址是否是同个地址 的相似度算法,采用 余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。 

public final class ScoreUtil {
    private static Logger log = LoggerFactory.getLogger(ScoreUtil.class);

    /** 乡镇附属词 */
    private static final String WORD_TYPE_4 = "乡,镇,街道办事处,街道办,街道";

    /** 社区居委附属词 */
    private static final String WORD_TYPE_5 = "社区,社区居民委员会,村民委员会,社区居村委,社区居委,居村委,居委会,村委会,委员会,居委,村委,委会,村";

    /** 路附属词 */
    private static final String WORD_TYPE_6 = "道路,路,大街,街,巷";

    /** 自定义地址唯一组合 */
    private static final String[] UNION_SIMILAR = { "1&2&4&6", "1&3&6", "1&3" };

    /**
     * 
     */
    private ScoreUtil() {
    }

    /**
     * 计算两个地址的相似度
     * 
     * @param sourceAddr 源地址
     * @param standAddr 标准地址
     * @return
     * @throws Exception
     */
    public static long score(String sourceAddr, String standAddr) throws Exception {
        Map<Integer, String> sourceWords = WordSolrUtil.splitAddressWordNames(sourceAddr);
        Map<Integer, String> standWords = WordSolrUtil.splitAddressWordNames(standAddr);
        if (standWords.size() == 0 || sourceWords.size() == 0) {
            return 0L;
        }
        Integer sourceWordMaxType = Collections.max(sourceWords.keySet());
        Integer standWordMaxType = Collections.max(standWords.keySet());
        String sourceWordStr = null;
        String standWordStr = null;
        // 命中的词类型组合
        StringBuilder matchType = new StringBuilder();
        for (int i = (standWordMaxType > sourceWordMaxType ? standWordMaxType : sourceWordMaxType); i >= 1; i--) {
            sourceWordStr = sourceWords.get(i);
            standWordStr = standWords.get(i);
            if (i == 4) {
                if (StringUtils.isNotBlank(sourceWordStr)) {
                    sourceWords.put(i, sourceWordStr.replaceFirst("[" + WORD_TYPE_4 + "]$", "") + "乡镇");
                }
                if (StringUtils.isNotBlank(standWordStr)) {
                    standWords.put(i, standWordStr.replaceFirst("[" + WORD_TYPE_4 + "]$", "") + "乡镇");
                }
            } else if (i == 5) {
                if (StringUtils.isNotBlank(sourceWordStr)) {
                    sourceWords.put(i, sourceWordStr.replaceAll("[" + WORD_TYPE_5 + "]", "") + "居村委");
                }
                if (StringUtils.isNotBlank(standWordStr)) {
                    standWords.put(i, standWordStr.replaceAll("[" + WORD_TYPE_5 + "]", "") + "居村委");
                }
            } else if (i == 6) {
                if (StringUtils.isNotBlank(sourceWordStr)) {
                    sourceWords.put(i, sourceWordStr.replaceFirst("[" + WORD_TYPE_6 + "]$", "") + "大道");
                }
                if (StringUtils.isNotBlank(standWordStr)) {
                    standWords.put(i, standWordStr.replaceFirst("[" + WORD_TYPE_6 + "]$", "") + "大道");
                }
            }

            // 字符串相似度大于0.9,则标记为命中
            if (strSimilarMatch(sourceWords.get(i), standWords.get(i)) >= 0.9) {
                matchType.append(i).append("&");
            }
        }

        // 用于比较的地址字符串
        StringBuilder sourceAddrCompareStr = new StringBuilder();
        StringBuilder standAddrCompareStr = new StringBuilder();
        filterAddrToEquivalent(sourceWords, standWords, sourceWordMaxType, standWordMaxType, matchType,
                sourceAddrCompareStr, standAddrCompareStr);
        log.debug("源地址过滤后:" + sourceAddrCompareStr.toString());
        log.debug("标地址过滤后:" + standAddrCompareStr.toString());

        return Math.round(linearSpaceVectorMacth(sourceAddrCompareStr.toString(), standAddrCompareStr.toString()));
    }

    /**
     * 根据配置信息及别名过滤两个地址为等价地址
     * 
     * @param sourceWords
     * @param standWords
     * @param sourceWordMaxType
     * @param standWordMaxType
     * @param matchType
     * @param sourceAddrCompareStr
     * @param standAddrCompareStr
     */
    private static void filterAddrToEquivalent(Map<Integer, String> sourceWords, Map<Integer, String> standWords,
            Integer sourceWordMaxType, Integer standWordMaxType, StringBuilder matchType,
            StringBuilder sourceAddrCompareStr, StringBuilder standAddrCompareStr) {
        // 命中的词
        String[] matchedType = matchType.toString().contains("&") ? matchType.toString().split("&", 0) : new String[0];
        Arrays.sort(matchedType, new Comparator<String>() {

            @Override
            public int compare(String o1, String o2) {
                if (StringUtils.isBlank(o1)) {
                    return 1;
                }
                if (StringUtils.isBlank(o2)) {
                    return -1;
                }
                if (o1.equals(o2)) {
                    return 0;
                }
                return Integer.parseInt(o1) > Integer.parseInt(o2) ? 1 : -1;
            }
        });

        // 根据配置,移除可忽略的词
        for (int i = 0; i < UNION_SIMILAR.length; i++) {
            boolean isMatchedWithConfig = true;
            if (UNION_SIMILAR[i].split("&").length >= matchedType.length) {
                // 判断命中的词组是否与配置指定的一致
                for (String type : matchedType) {
                    if (StringUtils.isNotBlank(type) && Arrays.binarySearch(UNION_SIMILAR[i].split("&"), type) < 0) {
                        isMatchedWithConfig = false;
                        break;
                    }
                }

            } else {
                for (String type : UNION_SIMILAR[i].split("&")) {
                    if (StringUtils.isNotBlank(type) && Arrays.binarySearch(matchedType, type) < 0) {
                        isMatchedWithConfig = false;
                        break;
                    }
                }
                if (isMatchedWithConfig) {
                    matchedType = UNION_SIMILAR[i].split("&");
                }
            }

            if (isMatchedWithConfig && matchedType.length > 0) {
                // 补上缺省的词
                for (int j = Integer.parseInt(matchedType[0]); j <= Integer
                        .parseInt(matchedType[matchedType.length - 1]); j++) {
                    if (Arrays.binarySearch(matchedType, String.valueOf(j)) < 0) {
                        if (sourceWords.keySet().contains(j)) {
                            standWords.put(j, sourceWords.get(j));
                        } else if (standWords.keySet().contains(j)) {
                            sourceWords.put(j, standWords.get(j));
                        }
                    }
                }
            }
        }

        // 组装地址词组为字符串信息
        for (int i = 1; i <= (standWordMaxType > sourceWordMaxType ? standWordMaxType : sourceWordMaxType); i++) {
            sourceAddrCompareStr.append(StringUtils.trimToEmpty(sourceWords.get(i)));
            standAddrCompareStr.append(StringUtils.trimToEmpty(standWords.get(i)));
        }
    }

    /**
     * 线性空间几何
     * 
     * @param source
     * @param target
     * @return
     */
    private static double linearSpaceVectorMacth(String source, String target) {
        Set<Character> set = new HashSet<Character>();
        for (char c : source.toCharArray()) {
            set.add(c);
        }
        for (char c : target.toCharArray()) {
            set.add(c);
        }
        Character[] targetA = set.toArray(new Character[] {});
        int[] sourceArg = parseAddrToSpaceVector(targetA, source);
        int[] targetArg = parseAddrToSpaceVector(targetA, target);
        return cos(sourceArg, targetArg) * 100;
    }

    /**
     * 计算空间向量夹角cos值
     * 
     * @param point1
     * @param point2
     * @return
     */
    private static double cos(int[] point1, int[] point2) {
        int count = 0;
        for (int i = 0; i < point1.length; i++) {
            count += point1[i] * point2[i];
        }

        double a1 = 0.0;
        for (int i = 0; i < point1.length; i++) {
            a1 += point1[i] * point1[i];
        }
        a1 = Math.sqrt(a1);

        double a2 = 0.0;
        for (int i = 0; i < point2.length; i++) {
            a2 += point2[i] * point2[i];
        }
        a2 = Math.sqrt(a2);

        return count / (a1 * a2);
    }

    /**
     * 解析地址为空间向量坐标
     * 
     * @param tag
     * @param str
     * @return
     */
    private static int[] parseAddrToSpaceVector(Character[] tag, String str) {
        int[] rs = new int[tag.length];
        int count = 0;
        int i = 0;
        for (char t : tag) {
            count = 0;
            for (char c : str.toCharArray()) {
                if (t == c) {
                    count++;
                }
            }
            rs[i] = count;
            i++;
        }
        return rs;
    }

    /**
     * 字符串相似度匹配
     * 
     * @param compare
     * @param to
     * @return
     */
    public static double strSimilarMatch(String compare, String to) {
        if (StringUtils.isBlank(compare) || StringUtils.isBlank(to)) {
            return 0;
        }
        // 字符串相似度比较
        int len1 = compare.length();
        int len2 = to.length();

        int[][] dif = new int[len1 + 1][len2 + 1];
        for (int a = 0; a <= len1; a++) {
            dif[a][0] = a;
        }
        for (int a = 0; a <= len2; a++) {
            dif[0][a] = a;
        }

        int temp;
        for (int i = 1; i <= len1; i++) {
            for (int j = 1; j <= len2; j++) {
                if (compare.charAt(i - 1) == to.charAt(j - 1)) {
                    temp = 0;
                } else {
                    temp = 1;
                }
                dif[i][j] = min(dif[i - 1][j - 1] + temp, dif[i][j - 1] + 1, dif[i - 1][j] + 1);
            }
        }
        return 1 - (double) dif[len1][len2] / Math.max(compare.length(), to.length());
    }

    /**
     * 查找集合最小值
     * 
     * @param is
     * @return
     */
    private static int min(int... is) {
        int min = Integer.MAX_VALUE;
        for (int i : is) {
            if (min > i) {
                min = i;
            }
        }
        return min;
    }
}
作者 east
Java 3月 14,2021

Java开发最全学习资料(持续更新)

学习视频:

零基础小白真正轻松学Java|2020入门Java高薪

JAVA设计模式

Java零基础全栈就业班

java高级大互联网架构师进阶

Java分布式锁实战教程(基于Spring Boot)

Redis高并发高可用集群 整合SpringBoot百万级秒杀实战

WebSocket整合Spring、SockJS、Stomp、Rabbitmq分布式消息推送

SpringBoot2.0前后端分离开发之用户身份认证实战 (后端实现)

Spring Cloud Alibaba特训营

全新版本分布式架构教程 SpringCloud+Docker基础入门到高级实战

Spring特训营(手写篇)java高级开发 java架构师进阶课程

JVM深入浅出特训营

MySQL数据库深度讲解(设计+SQL语句)视频课程

MySQL从入门到入魔,Java高级,java进阶

深入Mybatis原理与实战

全新录制Elasticsearch7.X搜索引擎项目实战Java架构视频教程

企业级搜索引擎 ElasticSearch 7 实战

ES训练营/基于ElasticStack快速打造三位一体实时监控分析平台

700多分钟干货实战,Java多线程高并发高性能实战全集

分布式医疗云平台项目实战

Docker 网络详解

Nginx 从入门到百万并发实战

作者 east
大数据开发 3月 14,2021

大数据开发最全学习资料(持续更新)

Hadoop从0到精通详解教程,2021年最新全套

大数据开发-合适新手入门+深入

大数据开发就业教程

大数据全栈就业班 


大数据基石Hadoop由浅入深,从原理到源码全面征服

基于淘宝从架构到需求,由浅入深全面了解大数据的数据仓库

大数据金融离线数据仓库项目实战与运营分析

大数据Scala编程语言完整视频教程

大数据生态圈/Hadoop/Spark/Flink/数据仓库/实时分析/推荐系统

Flink大数据项目实战【大讲台】

大数据Spark实战训练营/3天掌握Spark京东电商实战案例

基于淘宝从理论到实战由浅入深全面了解最火的实时框架Flink

医药数据分析通识课:SAS编程与CDISC标准

作者 east
Java 3月 11,2021

使用Springboot @Value配置时遇到几个不生效的问题

在开发项目时,把一些可能变化的东西,尽量搞成配置文件。这样以后有变化时,改一下配置就可以,不用开发人员重新编译。

使用Springboot的@Value, 常规配置方法是这样:

@Compent
public class TestA{

@Value("${MY_URL}")
private String myUrl;
}

在开发当中,如果按上面方式,遇到下面情况会不生效:

1、静态变量

不能像常规那样使用,要使用set方法,例如:

@Compent
public class TestA{
private static String myUrl;

@Value("${MY_URL}")
public void setMyUrl(String url){
myUrl = url;
}
}

2、构造函数

@Compent
public class TestA{
 public TestA(@Value("${MY_URL}") String myUrl){
 }
}
作者 east
Java 3月 11,2021

Properties获取配置的数组

JDK自带的Properties类没有Springboot用Value配置参数那么方便,尤其是数组, Properties 没有相应的方法。但可以用变通的方式。就是把数组配置成字符串,用特殊符号分隔。

InputStream in = RunTest.class.getClassLoader().getResourceAsStream("application.properties");
        try {
            properties.load(in);

            String redisListString = properties.getProperty("redisList");
String[] arr = redisListString.split(",");
}catch(Exception ex){
}

application.properties的配置如下:

redisList=192.68.1.2:22409,192.68.1.3:22532

作者 east

上一 1 … 27 28 29 … 41 下一个

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。回复”chatgpt”获取免注册可用chatgpt。回复“大数据”获取多本大数据电子书

标签

AIGC AI创作 bert chatgpt github GPT-3 gpt3 GTP-3 hive mysql O2O tensorflow UI控件 不含后台 交流 共享经济 出行 图像 地图定位 外卖 多媒体 娱乐 小程序 布局 带后台完整项目 开源项目 搜索 支付 效率 教育 日历 机器学习 深度学习 物流 用户系统 电商 画图 画布(canvas) 社交 签到 联网 读书 资讯 阅读 预订

官方QQ群

小程序开发群:74052405

大数据开发群: 952493060

近期文章

  • 如何在Chrome中设置启动时自动打开多个默认网页
  • spark内存溢出怎样区分是软件还是代码原因
  • MQTT完全解析和实践
  • 解决运行Selenium报错:self.driver = webdriver.Chrome(service=service) TypeError: __init__() got an unexpected keyword argument ‘service’
  • python 3.6使用mysql-connector-python报错:SyntaxError: future feature annotations is not defined
  • 详解Python当中的pip常用命令
  • AUTOSAR如何在多个供应商交付的配置中避免ARXML不兼容?
  • C++thread pool(线程池)设计应关注哪些扩展性问题?
  • 各类MCAL(Microcontroller Abstraction Layer)如何与AUTOSAR工具链解耦?
  • 如何设计AUTOSAR中的“域控制器”以支持未来扩展?

文章归档

  • 2025年7月
  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年1月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年7月
  • 2018年6月

分类目录

  • Android (73)
  • bug清单 (79)
  • C++ (34)
  • Fuchsia (15)
  • php (4)
  • python (45)
  • sklearn (1)
  • 云计算 (20)
  • 人工智能 (61)
    • chatgpt (21)
      • 提示词 (6)
    • Keras (1)
    • Tensorflow (3)
    • 大模型 (1)
    • 智能体 (4)
    • 深度学习 (14)
  • 储能 (44)
  • 前端 (5)
  • 大数据开发 (491)
    • CDH (6)
    • datax (4)
    • doris (31)
    • Elasticsearch (15)
    • Flink (78)
    • flume (7)
    • Hadoop (19)
    • Hbase (23)
    • Hive (41)
    • Impala (2)
    • Java (71)
    • Kafka (10)
    • neo4j (5)
    • shardingsphere (6)
    • solr (5)
    • Spark (100)
    • spring (11)
    • 数据仓库 (9)
    • 数据挖掘 (7)
    • 海豚调度器 (10)
    • 运维 (34)
      • Docker (3)
  • 小游戏代码 (1)
  • 小程序代码 (139)
    • O2O (16)
    • UI控件 (5)
    • 互联网类 (23)
    • 企业类 (6)
    • 地图定位 (9)
    • 多媒体 (6)
    • 工具类 (25)
    • 电商类 (22)
    • 社交 (7)
    • 行业软件 (7)
    • 资讯读书 (11)
  • 嵌入式 (71)
    • autosar (63)
    • RTOS (1)
    • 总线 (1)
  • 开发博客 (16)
    • Harmony (9)
  • 技术架构 (6)
  • 数据库 (32)
    • mongodb (1)
    • mysql (13)
    • pgsql (2)
    • redis (1)
    • tdengine (4)
  • 未分类 (7)
  • 程序员网赚 (20)
    • 广告联盟 (3)
    • 私域流量 (5)
    • 自媒体 (5)
  • 量化投资 (4)
  • 面试 (14)

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org

All Rights Reserved by Gitweixin.本站收集网友上传代码, 如有侵犯版权,请发邮件联系yiyuyos@gmail.com删除.