第十章YDB进阶使用详解
一、 Lucene原生查询语法的使用
YDB的索引本质上是Lucene索引,如果之前有使用Solr Cloud、ElasticSearch的朋友肯定对Lucene不陌生,对于Lucene有自己的强大的过滤筛选方式,YDB里面依然兼容这种语法方式。
1. 使用ydb_raw_query_s like 进行Lucene语法匹配
示例:
ydb_raw_query_s like 'cardnum:9612880118617710'
使用临近搜索的示例
ydb_raw_query_s like 'content:"建设银行"~0'
2. 使用ydb_code_query_s like 进行Lucene语法匹配
ydb_raw_query_s与ydb_code_query_s的区别是ydb_code_query_s里的值要进行urlencode编码
如:
ydb_code_query_s like 'content%3A%22%E5%BB%BA%E8%AE%BE%E9%93%B6%E8%A1%8C%22%7E0'
二、 自定义拓展分词类型
默认YDB提供了一些分词的数据类型,可以满足大部分的匹配场景,但是如果因为业务的特殊,我们需要自己对Lucene分词进行拓展,YDB也提供了拓展自定义分词的方式。具体使用方法跟Solr的schema.xml非常类似。
1. 首先 编辑lib下的 fieldType.txt 文件,增加新的分词类型
2. 然后将相关依赖的jar包放到ydb的lib目录下,并重启YDB
3. 建表示例
create table myntest(
c1 ft_yanniantest_y,
c2 ft_yanniantest_yy,
c3 ft_yanniantest_yyy,
c4 ft_yanniantest_yn,
c5 ft_yanniantest_yny,
c6 ft_yanniantest_yyyyyyy,
c7 ft_yanniantest_ynynyny
)
对应关系如下
三、 IK词库分词
YDB内置了第三方的IK词库分词,IK分词的介绍如下
1. IKAnalyzer 简介
IKAnalyzer 是一个开源基于 JAVA 语言的轻量级的中文分词第三方工具包,从 2006 年推出已经经历了三个较为完整的版本,目前最新版本为3.2.8,它基于 L ucene 为应用主体,但是也支持脱离 L ucene,成为一个独立的面向JAVA 的分词工具。
2. IKAnalyzer 特性
a. 算法采用“正向迭代最细粒度切分算法”, 支持细粒度和最大词长两种分词方式,速度最大支持 80W 字/秒(1600KB/秒) 。
b. 支持多子处理器分析模式:中文、数字、字母,并兼容日文、韩文。
c. 较小的内存占用,优化词库占有空间,用户可自定义扩展词库。 采用歧义分析算法优化查询关键字的搜索排列组
d. 扩展 L ucene 的扩展实现,
3. YDB内的IK数据类型
textik 、 ikyy 存储,并且采用IK进行分词
ikyn ,只进行IK分词,但不进行存储
4. IK分词的词库,怎样拓展
IK词库文件位于lib目录下的 IK_ext.dic
大家修改后,记得重启YDB,以便让词库生效。
四、 动态列,动态字段
跟Solr 一样,正常情况下,需要事先把知道的字段定义在创建表中创建好,但是有的时候某个表的字段会不确定,并没同一个表的不同行之间有可能使用的字段也会不同,这时可以使用动态字段。
这是一段动态字段的配置示例:
这样,送过来的索引数据中,如果有以 _s 结尾的字段的值都都会被按照上述的索引方式进行索引,如字段名称为title_s,content_s。
在匹配过程,如果动态字段和静态字段都符合,会优先匹配静态字段。另外动态字段的仅支持 * 这一通配符,这个通配符仅能位于开头或结尾。
动态字段(Dynamic fields)允许 YDB 索引没有在 create table 中明确定义的字段。这个在忘记定义一些字段时很有用。动态字段可以让系统更灵活,通用性更强。
动态字段和成规字段类似,除了它名字中包含一个通配符外,在索引文档时,一个字段如果在常规字段中没有匹配时,将到动态字段中匹配。
假设schema中定义了一个叫*_i的动态动态字段,如果要索引一个叫 cost_i 的字段,但是 schema 中不存在 cost_i 的字段,这样 cost_i 将被索引到 *_i 字段中。
动态字段也是定义在 schema.xml 文件中,和其他字段一样,它也有个名词,字段类型,和属性。
5. 动态字段的配置解析
1) name="*_s" 匹配规则
2) type="string" 该动态字段 匹配的Solr的 fieldType (记住,并不是YDB的数据类型,后面我们会列出默认YDB内部支持的Solr的fieldType,当然也可以通过《自定义拓展分词类型》对于分词的类型进行自定义拓展)
3) indexed="true" 是否启用索引,如果启用该字段可以用于where中的检索
4) stored="false" 其否启用行存储,一般除了分词的类型使用按行存储外,其他的类型均建议按列存储
5) docValues="true" 其否启用列存储,一般除了分词的类型使用按行存储外,其他的类型均建议按列存储
6) omitNorms="true" 是否对字段的长度进行规范化,一般我们用不上,建议配置为true直接忽略
7) omitTermFreqAndPositions="true" 对于保存了位置的分词类型,通过这个参数可以配置该字段是否需要保存词频和位置,一般我们都设置为true,不启用。
6. YDB内部支持的solr的fieldType
1) string类型
name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true" omitTermFreqAndPositions="true" />
2) int类型
name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0" omitNorms="true" omitTermFreqAndPositions="true" />
3) float类型
name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0" omitNorms="true" omitTermFreqAndPositions="true" />
4) long类型
name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0" omitNorms="true" omitTermFreqAndPositions="true" />
5) double类型
6) tint类型
name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0" omitNorms="true" omitTermFreqAndPositions="true" />
7) tfloat类型
name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0" omitNorms="true" omitTermFreqAndPositions="true" />
8) tlong类型
name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0" omitNorms="true" omitTermFreqAndPositions="true" />
9) tdouble类型
name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0" omitNorms="true" omitTermFreqAndPositions="true" />
10) 多值列的string类型
name="mstring" class="solr.StrField" sortMissingLast="true" omitNorms="true" omitTermFreqAndPositions="true" multiValued="true" />
11) 多值列的int类型
name="mint" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />
12) 多值列的float类型
name="mfloat" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />
13) 多值列的long类型
name="mlong" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />
14) 多值列的double类型
name="mdouble" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />
15) 多值列的tint类型
name="mtint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />
16) 多值列的tfloat类型
name="mtfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />
17) 多值列的tlong类型
name="mtlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />
18) 多值列的tdouble类型
name="mtdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />
19) geopoint 用于地理位置存储的类型
name="geopoint" class="solr.TrieLongField" precisionStep="9" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />
20) 采用cjk二元分词的分词类型
omitNorms="true" omitTermFreqAndPositions="true" >
type="index">
class="org.apache.lucene.analysis.standard.StandardTokenizerFactory"/>
class="org.apache.lucene.analysis.cjk.CJKWidthFilterFactory"/>
class="org.apache.lucene.analysis.core.LowerCaseFilterFactory"/>
class="org.apache.lucene.analysis.cjk.CJKBigramFilterFactory" />
type="query">
class="org.apache.lucene.analysis.standard.StandardTokenizerFactory"/>
class="org.apache.lucene.analysis.cjk.CJKWidthFilterFactory"/>
class="org.apache.lucene.analysis.core.LowerCaseFilterFactory"/>
class="org.apache.lucene.analysis.cjk.CJKBigramFilterFactory" />
21) YDB内置的采用按照字符char方式分词的号码类型
omitNorms="true" omitTermFreqAndPositions="true" >
type="index">
class="cn.net.ycloud.ydb.tokenizer.ChepaiFactory" maxTokenLength="5" minTokenLength="3" isforsearch="false" />
type="query">
class="cn.net.ycloud.ydb.tokenizer.ChepaiFactory" maxTokenLength="5" minTokenLength="3" isforsearch="true" />
22) YDB内置的常规文本分词类型
omitNorms="true" omitTermFreqAndPositions="true" >
type="index">
class="cn.net.ycloud.ydb.tokenizer.SimpleTextFactory" maxTokenLength="3" minTokenLength="1" isforsearch="false" />
type="query">
class="cn.net.ycloud.ydb.tokenizer.SimpleTextFactory" maxTokenLength="3" minTokenLength="1" isforsearch="true" />
23) YDB内置的保存了词的存储位置信息的,按照字符char方式分词的号码类型
omitNorms="true" omitTermFreqAndPositions="false" omitPositions="false">
type="index">
class="cn.net.ycloud.ydb.tokenizer.ChepaiFactory" maxTokenLength="5" minTokenLength="3" isforsearch="false" />
type="query">
class="cn.net.ycloud.ydb.tokenizer.ChepaiFactory" maxTokenLength="5" minTokenLength="3" isforsearch="true" />
24) YDB内置的保存了词的存储位置信息的,普通文本分词
omitNorms="true" omitTermFreqAndPositions="false" omitPositions="false" >
type="index">
class="cn.net.ycloud.ydb.tokenizer.SimpleTextFactory" maxTokenLength="3" minTokenLength="1" isforsearch="false" />
type="query">
class="cn.net.ycloud.ydb.tokenizer.SimpleTextFactory" maxTokenLength="3" minTokenLength="1" isforsearch="true" />
25) YDB内置的保存了词的位置的以及分词的时候保存了多远分词的元长度的,按照按照字符char方式分词的号码类型
omitNorms="true" omitTermFreqAndPositions="false" omitPositions="false">
type="index">
class="cn.net.ycloud.ydb.tokenizer.ChepaiFactory" ismaketag="true" maxTokenLength="5" minTokenLength="1" isforsearch="false" />
type="query">
class="cn.net.ycloud.ydb.tokenizer.ChepaiFactory" ismaketag="true" maxTokenLength="5" minTokenLength="1" isforsearch="true" />
26) YDB内置的保存了词的位置的以及分词的时候保存了多远分词的元长度的,按照按照字符char方式分词的常规文本类型
omitNorms="true" omitTermFreqAndPositions="false" omitPositions="false" >
type="index">
class="cn.net.ycloud.ydb.tokenizer.SimpleTextFactory" ismaketag="true" maxTokenLength="3" minTokenLength="1" isforsearch="false" />
type="query">
class="cn.net.ycloud.ydb.tokenizer.SimpleTextFactory" ismaketag="true" maxTokenLength="3" minTokenLength="1" isforsearch="true" />
27) 第三方的采用字段词库的IK分词
omitNorms="true" omitTermFreqAndPositions="true" >
type="index">
class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" />
type="query">
class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" />
28) 保存了词的位置的 cjk二元分词
omitPositions="false" >
type="index">
class="org.apache.lucene.analysis.standard.StandardTokenizerFactory"/>
class="org.apache.lucene.analysis.cjk.CJKWidthFilterFactory"/>
class="org.apache.lucene.analysis.core.LowerCaseFilterFactory"/>
class="org.apache.lucene.analysis.cjk.CJKBigramFilterFactory" />
type="query">
class="org.apache.lucene.analysis.standard.StandardTokenizerFactory"/>
class="org.apache.lucene.analysis.cjk.CJKWidthFilterFactory"/>
class="org.apache.lucene.analysis.core.LowerCaseFilterFactory"/>
class="org.apache.lucene.analysis.cjk.CJKBigramFilterFactory" />
29) lucene默认的文本分词
omitNorms="true" omitTermFreqAndPositions="true" >
type="index">
class="org.apache.lucene.analysis.standard.StandardTokenizerFactory"/>
class="org.apache.lucene.analysis.core.LowerCaseFilterFactory"/>
type="query">
class="org.apache.lucene.analysis.standard.StandardTokenizerFactory"/>
class="org.apache.lucene.analysis.core.LowerCaseFilterFactory"/>
30) 采用lucene默认的文本分词,但保存了词的位置的类型
omitPositions="false" >
type="index">
class="org.apache.lucene.analysis.standard.StandardTokenizerFactory"/>
class="org.apache.lucene.analysis.core.LowerCaseFilterFactory"/>
type="query">
class="org.apache.lucene.analysis.standard.StandardTokenizerFactory"/>
class="org.apache.lucene.analysis.core.LowerCaseFilterFactory"/>
7. YDB内置的动态字段
1) 常规类型的内置定义
/>
/>
/>
omitNorms="true" omitTermFreqAndPositions="true" />
/>
omitNorms="true" omitTermFreqAndPositions="true" />
omitNorms="true" omitTermFreqAndPositions="true" />
2) 多值列的内置定义
omitNorms="true" omitTermFreqAndPositions="true" />
omitNorms="true" omitTermFreqAndPositions="true" />
omitNorms="true" omitTermFreqAndPositions="true" />
omitNorms="true" omitTermFreqAndPositions="true" />
omitNorms="true" omitTermFreqAndPositions="true" />
omitNorms="true" omitTermFreqAndPositions="true" />
omitNorms="true" omitTermFreqAndPositions="true" />
omitNorms="true" omitTermFreqAndPositions="true" />
3) 分词类型的内置定义
4) 分词类型并且存储了位置的内置定义
8. 自定义拓展新的动态列
大家可以编辑lib目录下的 dynamicField.txt 文件,添加自己的动态列,写法同上。
编辑完毕后,要重启YDB。
五、 利用Spoon的Kattle将传统数据库的数据导入到YDB中
1. 拷贝JDBC驱动包(oracle):
data-integration\lib
ojdbc6.jar
2. 拷贝Hadoop配置文件(ydbmaster)
data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations\hdp24 (ydb master )
core-site.xml
hdfs-site.xml
yarn-site.xml
mapred-site.xml
3. 设置HDP插件版本
4. 创建YDB表
5. 创建Hive外部表
6. 创建 Spoon 转换项目
7. 插入表输入模块
8. 插入 Hadoop File Output 模块
9. 插入阻塞数据模块
10. 插入执行SQL脚本模块
11. 运行并显示结果
六、 如何利用Sqoop将传统数据库的数据导入到YDB中
Sqoop本质上是一个ETL工具,可以将传统数据里面的数据,导出到 HDFS中,然后通过Hive表就可以将数据导入到YDB中
1. Sqoop导出到HDFS基本的Oracle示例如下
sqoop import --connect jdbc:oracle:thin:@ xx.xx.xx.xx :1521: xxxdb --username 用户名 --password 密码 --query "select c1,c2,xxxx,xxx from 数据表 where \$CONDITIONS " --target-dir /data/sqoop/ oracle表名 /$vardate --input-null-string '\\N' --input-null-non-string '\\N' --split-by id --fields-terminated-by '\001' -m 1
2. 我给客户写的一个同步的小shell程序
#!/usr/bin/env bash
vardate="ydb_default_partion"
varmonth="ydb_default_partion"
echo $vardate
echo $varmonth
#----step one ---
echo "begin step one"
hadoop fs -mkdir -p /data/sqoop/table_exampel/$vardate
hadoop fs -rm -r /data/sqoop/table_exampel/$vardate
sqoop import --connect jdbc:sap://10.36.11.108:30015 --driver com.sap.db.jdbc.Driver --username oracleUser --password oraclepasswd --query "select * FROM oracle_table_name WHERE \$CONDITIONS" --target-dir /data/sqoop/table_exampel/$vardate --split-by xh --fields-terminated-by '\001' -m 1
#----step two ---
echo "begin step two"
echo "plaase create table_exampel_txt on hive first "
echo "ALTER TABLE table_exampel_txt DROP IF EXISTS PARTITION (event_day='$vardate'); " > /ydb/daoru.sql
echo "ALTER TABLE table_exampel_txt ADD IF NOT EXISTS PARTITION (event_day='$vardate') LOCATION '/data/sqoop/table_exampel/$vardate'; " >> /ydb/daoru.sql
echo "select * from table_exampel_txt where event_day='$vardate'; " >> /ydb/daoru.sql
sh /opt/ydbsoftware/ya100/bin/sql.sh -f /ydb/daoru.sql
#----step three ---
echo "begin step three"
cat << EOF >/ydb/daoru.sql
insert into table ydbpartion
select 'table_exampel', '$varmonth', '',
YROW(
'ID',ID,
'xxx1',xx1,
'xx2',xx2,
'FLAG',FLAG
)
from table_exampel_txt where event_day='$vardate';
/*ydb.pushdown('->')*/
select count(*) from table_exampel where ydbpartion = "$varmonth"
/*('<-')pushdown.ydb*/
EOF
sh /opt/ydbsoftware/ya100/bin/sql.sh -f /ydb/daoru.sql
echo "execute finished"
七、 如何将HBase中的数据导入到YDB里
默认Hive提供了与HBase对接的API,但是放在了Spark中兼容性不是特别好。YDB修改了这个地方,以便为了能让其运行,但是实测性能一般。
1. 通过Spark可以与HBase进行连接,
这样就可以方便的将数据从HBase中导入到Ydb中了
具体原理参考http://www.tuicool.com/articles/N36Brm
l 第1步,复制相关依赖的jar包到ya100的lib目录下(注意,这里极容易产生jar包冲突,比如hive与hbase版本不匹配)
如:
$HIVE_HOME/lib/hive-hbase-handler-0.13.1.jar
$HBASE_HOME/lib/hbase-client-0.96.1.1-cdh5.0.0.jar
$HBASE_HOME/lib/hbase-common-0.96.1.1-cdh5.0.0.jar
$HBASE_HOME/lib/hbase-protocol-0.96.1.1-cdh5.0.0.jar
$HBASE_HOME/lib/hbase-server-0.96.1.1-cdh5.0.0.jar
$HBASE_HOME/lib/htrace-core-2.01.jar
$HBASE_HOME/lib/protobuf-java-2.5.0.jar
$HBASE_HOME/lib/guava-12.0.1.jar
并且 配置环境变量,记得jar包名字别写错了
export SPARK_CLASSPATH=/home/ycloud/ya100/lib/guava-12.0.1.jar:/home/ycloud/ya100/lib/hive-hbase-handler-1.2.1.2.3.4.0-3485.jar:/home/ycloud/ya100/lib/hbase-client.jar:/home/ycloud/ya100/lib/hbase-common.jar:/home/ycloud/ya100/lib/hbase-protocol.jar:/home/ycloud/ya100/lib/hbase-server.jar:/home/ycloud/ya100/lib/htrace-core-3.1.0-incubating.jar:/home/ycloud/ya100/lib/protobuf-java-2.5.0.jar
l 第2步,配置HBase的Master地址
将hbase-site.xml 的内容复制到hive-site.xml
l 第3步,创建Hive与HBase的连接表(HBase默认的HBaseStorageHandler在Spark下有兼容性的问题,我稍微改了下)
CREATE TABLE hbase_table(
phonenum bigint, usernick string, ydb_sex string, ydb_province string, ydb_grade string, ydb_age string, ydb_blood string, ydb_zhiye string, ydb_earn string, ydb_prefer string, ydb_consume string, ydb_day string, amtdouble double,amtlong int, content string
)
STORED BY 'cn.net.ycloud.ydb.handle.HBaseStorageHandler_YDB'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:usernick,cf1:ydb_sex,cf1:ydb_province,cf1:ydb_grade,cf1:ydb_age,cf1:ydb_blood,cf1:ydb_zhiye,cf1:ydb_earn,cf1:ydb_prefer,cf1:ydb_consume,cf1:ydb_day,cf1:amtdouble,cf1:amtlong,cf1:content")
TBLPROPERTIES ("hbase.table.name" = "hive_hbase_2016");
2. 读取HBase中的数据到文本形式的Hive表中
insert overwrite table ydb_example_ txt select *,'hbase2ydb',1 from hbase_table;
ps:本质上可以直接导入到YDB中,但是实测发现,这种方式导入的数据,Map数量并不均衡,有比较严重的数据倾斜,性能不好,所以我们不在给出直接导入到YDB中的例子,而是先导到Hive的文本表,然后通过文本表在导入到YDB中
3. 从文本表导入到YDB总
使用方法,请参考前文,这里不做重复介绍。
八、 YDB系统表,日志表
1. 启用系统表
YDB内置日志表,需要通过Kafka来收集消息,如果要启动内部日志表,需要在ydb_site.yaml里配置如下Kafka参数
ydb.reader.ydb_syslog: 'true'
kafka.topic.ydb_syslog: 'ydb_syslog'
bootstrap.servers.ydb_syslog: 'ydbmaster:6667'
2. --数据预览
/*ydb.pushdown('->')*/
select * from y_system_log order by log_time desc
limit 30
/*('<-')pushdown.ydb*/
;
3. --查看最近执行过的SQL(HIVE)
/*ydb.pushdown('->')*/
select log_time,log_day,reqid_syn,timelen_lyn,log_hour,log_category,log_type,log_pos,log_ip,log_pid,log_execid,log_execindex,log_fields,log_hostname,log_msg from y_system_log where log_category='SQL' and (log_type='getExecuteSql') order by reqid_syn desc,log_time desc
limit 30
/*('<-')pushdown.ydb*/
;
4. --按照ID查看特定某一SQL
/*ydb.pushdown('->')*/
select log_time,log_day,reqid_syn,timelen_lyn,log_hour,log_category,log_type,log_pos,log_ip,log_pid,log_execid,log_execindex,log_fields,log_hostname,log_msg from y_system_log where log_category='SQL' and reqid_syn='161204024000000002' order by log_time desc
limit 30
/*('<-')pushdown.ydb*/
;
5. --查看系统报错
/*ydb.pushdown('->')*/
select log_time,log_day,log_hour,log_category,log_type,log_pos,log_ip,log_pid,log_execid,log_execindex,log_fields,log_hostname,log_msg from y_system_log where log_category='ERROR' order by log_time desc
limit 30
/*('<-')pushdown.ydb*/
;
6. --查看系统负载
/*ydb.pushdown('->')*/
select log_time,log_day,log_hour,log_category,log_type,log_pos,log_ip,log_pid,log_execid,log_execindex,log_hostname,os_cpu_user_lyn,os_cpu_nick_lyn,os_cpu_sys_lyn,os_cpu_idle_lyn,os_iowait_lyn,os_steal_lyn,os_mem_total_lyn,os_mem_free_lyn,os_mem_used_lyn,os_mem_buff_lyn,os_mem_cache_lyn from y_system_log where log_category='SYSTEMINFO' order by log_time desc
limit 30
/*('<-')pushdown.ydb*/
;
7. --线程池
/*ydb.pushdown('->')*/
select log_time,log_day,log_hour,log_category,log_type,log_pos,log_ip,log_pid,log_execid,log_execindex,log_fields,log_hostname,log_msg from y_system_log where log_category='POOL' order by log_time desc
limit 30
/*('<-')pushdown.ydb*/
;
8. --统计
/*ydb.pushdown('->')*/
select log_type,count(*) as cnt from y_system_log group by log_type order by cnt desc
limit 30
/*('<-')pushdown.ydb*/
;
/*ydb.pushdown('->')*/
select log_day,count(*) as cnt from y_system_log group by log_day order by cnt desc
limit 30
/*('<-')pushdown.ydb*/
;
/*ydb.pushdown('->')*/
select log_category,count(*) as cnt from y_system_log group by log_category order by cnt desc
limit 30
/*('<-')pushdown.ydb*/
;
/*ydb.pushdown('->')*/
select log_category,log_type,log_pos,count(*) as cnt from y_system_log group by log_category,log_type,log_pos order by cnt desc
limit 30
/*('<-')pushdown.ydb*/
;
九、 10万列规模以上的大宽表如何处理?
Hive表并不支持太多的列,对于Oracle来说最多支持1000个列,如果我们的业务有一个将近一万个列的大宽表,应该怎么办?
1. 传统做法存在什么问题?
如果我们采用传统做法,直接写一个10万列的create table语句。
l 12W列意味着生成的schema文件就要20多m,由于太大,读取这个表的配置一是耗费很多内存,二是解析也很慢。
l Lucene内部的列也很多,在打开索引文件的时候,由于要加载列的信息,索引文件的打开会特别慢。
l 12w列在Hive表中(Spark 的Hive SQL模式),也意味着占用太多的元数据库信息,而且建表也容易失败,要知道Hadoop的configuration也是有大小限制的。
2. 应该如何做?
l 数据类型相近的列,经常一起访问的列,推荐分组并合并,YDB内置有多值列,可以用这一个列存储,这一个组内多个不同的值,这样值的个数没有少,但是列数少了很多。更多的请参考多值列的示例。
l 有些列可以采用动态列,减少生成的schema.xml的大小。
l ya100_env.sh 如下配置都要改,要至少分配20G以上内存
export YA100_MEMORY=25000m
export YA100_DRIVER_MEMORY=15000m
十、 使用帆软FineReport生成基于YDB数据的报表
FineReport是由帆软自主研发的一款纯Java编写的报表软件产品,集数据展示(报表)和数据录入(表单)功能于一身,能够制作复杂的报表,操作简单易用。针对软件开发商和系统集成商,用于快速构建企业信息系统的中国式Web报表软件。由于帆软支持jdbc接入,故YDB也可以与帆软集成。
下面为集成的示例:
1. 报表类型
2. 常用的图表种类
3. 首先将HIVE的JDBC驱动Jar包
hive-jdbc-1.2.1-standalone.jar(该jar包可在ydb的libexec中找到)
复制到${FineReport_Home}\WebReport\WEB-INF\lib中
${FineReport_Home}:FineReport的根目录
4. 创建JDBC连接
打开菜单:服务器 ① ->定义数据连接 ② 创建一个HIVE的JDBC连接
5. 创建数据库连接
点击加号创建一个数据连接 ① ,驱动器栏输入(org.apache.hive.jdbc.HiveDriver) ② ,
在URL中输入(jdbc:hive2://ydbmaster:10009/default)其中ydbmaster为所要连接的主机域名 ③ ,配置完成后点击测试连接,检查是否配置正确 ④
6. 创建一个模板数据集
7. 编辑数据集
选择上一步创建的数据库连接 ① ,在白色输入框中写入sql语句,YDB SQL需要使用特殊的标签包裹 ② 而HIVE SQL则不需要,在WHERE条件的开始处添加一条必定为真的条件,例如性别字段中的值不为0 ③ 。
使用函数${if(len(字段名) == 0,"默认值或空","and 字段名 = '" + 变量名 + "'")}来设定如果值为空则不查询或查询默认值④ ,点击刷新 ⑤ 会在下方显示设定的参数,可通过修改参数值来向sql中注入查询参数 ⑥ 。
在编辑好sql语句之后点击预览来查看sql语句是否能够成功执行 ⑦ 。
在 ⑧ 处可选择将所有查询结果都存储到内存中,还是当记录数大于定值的时候将剩余数据缓存到磁盘。
示例sql: 注意,帆软值SQL中支持写if模板变量,注意图中加粗的部分
/*ydb.pushdown('->')*/
select ydb_sex,ydb_grade,ydb_age,ydb_blood,amtlong
from ydb_example_shu
where ydb_sex!=0
${if(len(ydbpartion) == 0,"and ydbpartion=\'ydb_default_partion\'","and ydbpartion = '" +ydbpartion + "'")}
${if(len(ydb_sex) == 0,"","and ydb_sex = '" + ydb_sex + "'")}
${if(len(ydb_grade) == 0,"","and ydb_grade = '" + ydb_grade + "'")}
and (ydb_age='20到30岁' or ydb_blood='O')
and (amtlong like '([3000 TO 4000] )')
${if(len(limit) == 0," limit 100 "," limit "+limit+"")}
/*('<-')pushdown.ydb*/
8. 编辑模版数据集
1)在上一步中我们设定了四个查询字段参数:ydb_grade,ydb_sex,limit,ydbpartion,在此处我们需要创建相同名称的模板参数来关联它们,点击模板 ① ->模板参数 ② 进入模板参数编辑菜单,
2)点击 ① 添加一个模板参数,双击 ② 修改参数名称,可在 ③ 处设置参数的默认值
9. 生成查询表单
点击此处编辑查询表单 ① 。
此处是上一步创建的模板参数 ① ,点击 ” 全部添加 ” ② 创建对应参数的查询表单
点击此处选择表单框的类型
表单框的类型有很多,此处我们选择‘文本控件’。
10. 添加报表类型聚合块
将‘报表类型聚合块’拖拽至报表的空白区域
在图表的第一行输入列名,将数据模板中的数据列拖拽到对应的列名下
拖动右上和左下的灰色块可以调节表的列数和行数 ① ,右下的灰色块可以移动图表的位置 ②
11. 预览
点击左上的笔记本图标下的小箭头 ① ,选择数据分析 ②
在弹出页面的对应表单中输入查询参数,点击查询
12. 添加饼图
将饼图模块拖拽至报表空白区域,点击饼图区域,在屏幕右上角图表属性表区域中选择‘数据’标签页,定义对应的规则
由于报表类型聚合块大小不定,建议将其放在报表的下方
注:柱形图,条形图,折线图的设置方法与饼图相同。
预览
十一、 实时消息接入自定义Reader与Parser
YDB支持自定义任意的数据源接入,以及解析任意格式的数据,只需要您实现Reader与Parser的接口
1. Reader需要实现的普通接口
public interface RawDataReader
{
public void init(String prefix ,KVget config , int readerIndex , int readerCount )
throws IOException;
public List read()throws IOException;
public void close() throws IOException;
public void setParser(Parser parser );
}
2. 事务性Reader的接口
如果担心进程异常退出,可以进一步实现如下的接口,与binlog结合保证数据不丢失
public interface YdbRawDataReaderWithCommit extends YdbRawDataReader
{
public YdbParse Parse( byte [] ahead ) throws Throwable;
public long walWrite(YdbParse doclist ) throws Throwable;
public void walMayCommit( long maxcnt ,ArrayList doclist ) throws Throwable;
public void process(YdbParse doclist ) throws Throwable;
}
3. Parser需要实现的接口
默认我们只有JSON的Parser,如果我们的数据不是YDB的Json个数,就需要自己实现改接口来拓展
public interface Parser {
public abstract void init(String prefix ,KVget config ,
int readerIndex , int readerCount )
throws IOException;
public void setReaderMeta(Object meta );
public YdbParse parse(Object raw ) throws Throwable;
4. 如何使用写好的Reader
1) Reader与Parser实现完成后,将其以jar包的方式放到lib目录下
2) 更改ydb_site.xml变更Parser与Reader所指向的类名
3) 重启YDB
十二、 自定义拓展分词
默认YDB的分词采用Lucene分词,Lucene分词的写法示例如下
集团的内部通讯工具搜同事时,需要根据姓名后缀进行搜索。譬如“徐欢春”,我们要能根据“欢春”搜出这个人;“黄继刚”,要根据“继刚”为关键字搜出“黄继刚”。这是个很人性化的用户体验,当我们有同事的名字是三个字的时候,我们通常会叫他们名字的最后两个字。Lucene本身并没有提供这种分词器,只能自己照着Lucene已有的分词器进行模仿开发。
参照ngram分词器进行开发。
要定制这个后缀分词器,实现一个Tokenizer和一个工厂类就可以了。Tokenizer类是实际分词是要用到的类。为了方便单元测试,额外增加一个Analyzer类。
分词器类
package org.apache.lucene.analysis.suffix;
import java.io.IOException;
import java.io.Reader;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
/**
* 用于姓名取后缀的分词器
*
* @author cdlvsheng
* date : 2014年9月23日
* time : 下午1:49:36
* project : im-solr-web
* user : cdlvsheng
*/
public class SuffixTokenizer extends Tokenizer {
private Log LOG = LogFactory.getLog(SuffixTokenizer.class);
private char[] buffer = new char[1024];
private int suffixOffset;
private static int MAX_SIZE;
private int termSize;
private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
private final OffsetAttribute offsetAtt = addAttribute(OffsetAttribute.class);
protected SuffixTokenizer(Reader input) {
super(input);
}
protected SuffixTokenizer(AttributeFactory factory, Reader input) {
super(factory, input);
}
@Override
public boolean incrementToken() throws IOException {
try {
clearAttributes();
if (termSize != -1) {
termSize = input.read(buffer);
if (termSize >= 0) {
MAX_SIZE = termSize;
}
}
if (suffixOffset + 1 >= MAX_SIZE) {
return false;
}
termAtt.copyBuffer(buffer, suffixOffset, MAX_SIZE);
termAtt.setLength(MAX_SIZE - suffixOffset);
offsetAtt.setOffset(correctOffset(suffixOffset), correctOffset(MAX_SIZE));
LOG.debug(termAtt.buffer());
suffixOffset++;
} catch (Exception e) {
LOG.error(e.getMessage(), e);
}
return true;
}
@Override
public final void end() {
final int finalOffset = correctOffset(suffixOffset);
this.offsetAtt.setOffset(finalOffset, finalOffset);
}
@Override
public void reset() throws IOException {
super.reset();
termSize = 1;
suffixOffset = 1;
MAX_SIZE = 0;
}
}
incrementToken方法是实际分词时用到的方法。一会单元测试时可以看出它的作用。
工厂类
package org.apache.lucene.analysis.suffix;
import java.io.Reader;
import java.util.Map;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.util.TokenizerFactory;
import org.apache.lucene.util.AttributeSource.AttributeFactory;
public class SuffixTokenizerFactory extends TokenizerFactory {
public SuffixTokenizerFactory(Map args) {
super(args);
}
@Override
public Tokenizer create(AttributeFactory factory, Reader input) {
return new SuffixTokenizer(factory, input);
}
}
工厂类的作用就是产生分词器类的实例。
analyzer类
package org.apache.lucene.analysis.suffix;
import java.io.Reader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Tokenizer;
public final class SuffixAnalyzer extends Analyzer {
@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
final Tokenizer source = new SuffixTokenizer(reader);
return new TokenStreamComponents(source, source);
}
}
以上3个类合作就构成了一个完整的自定义分词器组件。
单元测试
package test.prefix.tokenizer;
import java.io.IOException;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.suffix.SuffixAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.junit.Test;
/**
* @author cdlvsheng
* date : 2014年9月22日
* time : 下午7:23:01
* project : im-solr-web
* user : cdlvsheng
*/
public class SuffixTest {
@SuppressWarnings("resource")
@Test
public void suffixTest() {
try {
SuffixAnalyzer analyzer = new SuffixAnalyzer();
TokenStream ts = analyzer.tokenStream("text", "黄继刚");
CharTermAttribute term = ts.addAttribute(CharTermAttribute.class);
ts.reset();
while (ts.incrementToken()) {
System.out.println(term.toString());
}
ts.end();
ts.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
十三、 为了OEM自定义YDB UI的header与footer样式
配置参数为
ydb.web.info.header
ydb.web.info.fooder
你可能感兴趣的:(大数据,hadoop,spark,solr,elasticsearch)
【高级篇】第6章 Elasticsearch 高级查询与搜索优化
JAVA和人工智能
elasticsearch 搜索引擎
在Elasticsearch的深入应用之旅中,掌握高级查询技巧与优化搜索性能是提升数据处理效率的关键。本章将带你深入探索Elasticsearch的高级查询特性,揭示搜索性能优化的奥秘,以及如何利用高亮与建议API增强用户体验。6.1复杂查询6.1.1Nested查询Nested基本概念与用法:在Elasticsearch中,nested类型是一种特殊的数据类型,用于存储复杂对象数组,使得数组中的
通义升级2.1文生视频模型
彩色蚂蚁
AIGC应用 AIGC 图像生成 音视频
作者公众号大数据与AI杂谈(TalkCheap),转载请标明出处年底果然各家AI视频厂商扎堆更新,昨天才写了一篇Vidu2.0版本更新的测评文章,同天通义也更新了他的文生视频模型,最新版本是2.1版和我两个月前做的测试相比,2.1版文生视频模型能力明显得到了大幅的提升,效果拔群,我总体甚至感觉这个版本可称当前(2025年1月10日)国内最强文生视频模型。那下面那我们来看看它的实际表现注:通义是阿里
中国信通院“护证计划”正式启动,合合信息入选首批技术支撑单位
大模型人工智能算法
随着人工智能技术的飞速发展,AI照“骗”在各个行业泛滥成灾,数字图像的真实性面临前所未有的挑战。近日,由中国互联网协会中小企业发展工委会主办的“卓信大数据计划”2025年度会议在京召开。本次会议上,中国信通院、中国互联网协会、中国图象图形学学会以及合合信息、蚂蚁安全实验室等多家企业代表共同启动了以AI守护AI,面向可信证照的专项行动“护证计划”,合合信息成功入选“护证计划”首批技术支撑单位。图说:
构建智慧校园:推动教育现代化的重要路径
智慧校园-合肥自友科技
智慧校园 数字化校园 智慧校园平台 智慧校园 智慧校园系统 智慧校园平台 智慧校园建设 智慧校园软件 智慧校园方案 智慧校园厂商
随着信息技术的飞速发展,智慧校园作为教育领域的新趋势,正逐渐成为推动教育现代化的重要力量。智慧校园不仅是一种物理空间的升级,更是一种教育理念和实践方式的革新。它强调利用大数据、人工智能、物联网等前沿技术,实现教学过程的智能化、个性化与高效化。智慧校园的核心在于智能硬件设施的广泛部署,如智能教室、电子白板、智能图书馆等,这些设备不仅能够提供更为便捷、高效的教与学环境,还能够收集并分析大量数据,为优化
自然语言处理入门:从基础概念到实战项目
范范0825
自然语言处理 人工智能
自然语言处理入门:从基础概念到实战项目一、引言自然语言处理(NaturalLanguageProcessing,简称NLP)是人工智能的重要分支,旨在让计算机能够理解、生成和处理人类语言。随着大数据和深度学习的发展,NLP技术在文本分类、机器翻译、问答系统、情感分析等领域得到了广泛应用。本文将从NLP的基础概念入手,逐步介绍关键技术,最终通过一个完整的实战项目帮助读者掌握如何在实际应用中使用NLP
ElasticSearch中使用“group by“ 统计 (ElasticsearchTemplate进行聚合查询)
不会吉他的肌肉男不是好的挨踢男
elasticsearch java elasticsearch java
我用的es是6.8.1如果我们想在es实现sql中的groupby的查询统计效果SELECTCOUNT(id)FROMpatientstudyGROUPBYhospitalId;在kibana中执行命令POST/patientstudy/_search?size=0{"aggs":{"count":{"terms":{"field":"hospitalId"}}}}看结果用java怎么实现呢pub
大数据、云计算系统高级架构师课程学习路线图
juan188
大数据 大数据开发 程序员 spark Linux 大数据学习 人工智能 数据分析 hadoop 大数据学习 大数据开发 大数据入门 大数据技术 大数据
大数据之Linux+大数据开发篇大数据的前景和意义也就不言而喻了,未来,大数据能够对大量、动态、能持续的数据,通过运用新系统、新工具、新模型的挖掘,从而获得具有洞察力和新价值的东西。源于互联网的发展,收集数据的门槛越来越低,收集数据变成一件简单的事情,这些海量的数据中是含有无穷的信息和价值的,如何更好的提炼出有价值的信息,这就体现大数据的用途了。大数据是未来的发展方向,正在挑战我们的分析能力及对世
Java I/O 与 NIO 核心区别及应用场景详解
豪宇刘
数据库 服务器 前端
一、核心概念对比特性传统I/O(BIO)NIO(NewI/O)模型同步阻塞模型同步非阻塞模型数据流方向单向流(InputStream/OutputStream)双向通道(Channel)数据操作单元基于字节/字符流基于缓冲区(Buffer)线程模型一个连接一个线程单线程管理多连接(Selector)适用场景低并发、大数据量传输高并发、短连接或长连接复用二、核心区别深度解析1.阻塞vs非阻塞BIO(
HIVE 面试题总结
小余真旺财
Hive hive
Hive依赖于HDFS存储数据,Hive将HQL转换成MapReduce执行,所以说Hive是基于Hadoop的一个数据仓库工具,实质就是一款基于HDFS的MapReduce计算框架,对存储在HDFS中的数据进行分析和管理。一、Hive架构用户接口:CLI(hiveshell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)元数据:元数据包括:表名、表所属的数据库(默
Elasticsearch:使用阿里云 AI 服务进行向量化和重新排名
作者:来自ElasticTomásMurúa在本文中,我们将介绍如何将阿里云AI功能与Elasticsearch集成,以提高语义搜索的相关性。阿里云人工智能搜索是一种将高级人工智能功能与Elasticsearch工具相结合的解决方案,利用QwenLLM/DeepSeek-R1系列提供高级推理和分类模型。在本文中,我们将使用同一作者撰写的小说和戏剧的描述来测试阿里巴巴重新排名和稀疏嵌入端点。步骤创建
Hive 面试题
昨夜为你摘星
什么是Hive?Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。Hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。Hive的意义(最初研发的原因)?降低程序员使用Hadoop的难度,降低学习成本Hive的内部组成模块,作用
深入探讨Ceph:分布式存储架构的未来
深度Linux
ceph 分布式 架构 C/C++
在数字化浪潮汹涌澎湃的当下,数据量呈爆发式增长,传统存储系统在应对海量数据存储、高并发访问以及灵活扩展等方面,逐渐显得力不从心。分布式存储技术应运而生,成为解决现代数据存储难题的关键方案,而Ceph作为分布式存储领域的佼佼者,正日益受到广泛关注和应用。Ceph以其卓越的性能、高可靠性、强大的扩展性以及开源的特性,在众多分布式存储系统中脱颖而出,被广泛应用于云计算、大数据、人工智能等前沿领域。无论是
Spark技术系列(一):初识Apache Spark——大数据处理的统一分析引擎
数据大包哥
# Spark 大数据
Spark技术系列(一):初识ApacheSpark——大数据处理的统一分析引擎1.背景与核心价值1.1大数据时代的技术演进MapReduce的局限性:磁盘迭代计算、中间结果落盘导致的性能瓶颈Spark诞生背景:UCBerkeleyAMPLab实验室为解决复杂迭代计算需求研发(2010年开源)技术定位:基于内存的通用分布式计算框架(支持批处理、流计算、机器学习、图计算等)1.2Spark内置模块S
python调用kafka
smile__su
python python kafka
先启动hadoop,zookeeper,kafka启动命令hadoop启动命令sbin/start-all.shzookeeper启动命令./bin/zkServer.shstart每台机器都要启动kafka启动命令bin/kafka-server-start.shconfig/server.properties每台机器都要启动进行以下操作的前提是将hadoop,zookeeper,kafka安装
《AI 大模型 ChatGPT 的传奇》
武昌库里写JAVA
面试题汇总与解析 课程设计 spring boot vue.js 算法 数据结构
《AI大模型ChatGPT的传奇》——段方某世界100强企业大数据/AI总设计师教授北京大学博士后助理:1三6三二四61四五41AI大模型的概念和特点1.1什么是”大模型、多模态“?1.2大模型带来了什么?1.3大模型为什么能产生质变?1.4算法层面的跃升1.4.1RNN到transformor1.4.2扩散模型diffusion1.4.3跨模态的CLIP框架1.5AIGC的耀眼成果1.5.1AI
十、大数据资源平台功能架构
moton2017
大数据治理 大数据 大数据治理 数据资产 数据管理 元数据 架构 数据资源
一、大数据资源平台的功能架构图总体结构大数据资源平台功能架构图关键组件:1.用户(顶行)此部分标识与平台交互的各种利益相关者。其中包括:市领导各部门分析师区政府外部组织公民开发人员运营经理2.功能模块(顶部水平部分)这些代表平台的主要功能区域:门户(Portal):用户访问平台的入口。开放中心(开放中心):方便数据共享和访问。共享中心(共享中心):管理数据共享和协作。运营中心:监控和管理平台的运营
分布式系统架构设计原理与实战:理解分布式系统的基本概念
AI天才研究院
计算 大数据 人工智能 语言模型 AI LLM Java Python 架构设计 Agent RPA
1.背景介绍在当今的互联网时代,数据量的爆炸性增长和业务的快速发展,使得单一的计算机系统已经无法满足我们的需求。为了解决这个问题,分布式系统应运而生。分布式系统是一种能在多台计算机(也称为节点)上运行,并通过网络进行通信和协调的系统。它能够提供高可用性、高可靠性、高扩展性和高性能等特性,因此在云计算、大数据、微服务等领域得到了广泛的应用。然而,设计和实现一个分布式系统并不是一件容易的事情。它涉及到
阿里云服务器的作用
腾云服务器
阿里云 服务器 云计算
使用阿里云服务器能做什么?大家都知道可以用来搭建网站、数据库、机器学习、Python爬虫、大数据分析等应用,阿里云服务器网来详细说下使用阿里云服务器常见的玩法以及企业或个人用户常见的使用场景:玩转阿里云服务器使用阿里云服务器最常见的应用就是用来搭建网站,例如个人博客、企业网站等;除了搭建网站还可以利用阿里云GPU服务器搭建机器学习和深度学习等AI应用;使用阿里云大数据类型云服务器做数据分析;利用云
数据湖构建
HaoHao_010
服务器 云服务器 云计算 阿里云
阿里云的数据湖构建(DataLake)是一种用于存储和处理大量不同类型数据的解决方案,通常用于大数据分析和机器学习等应用场景。数据湖与传统的数据仓库不同,它能够存储结构化、半结构化和非结构化数据,支持大规模数据的整合、存储、查询和分析。阿里云提供了一整套工具和服务来帮助企业构建数据湖,以下是数据湖构建的主要步骤和关键服务:1.数据湖概述数据湖是一种统一的数据存储库,能承载来自多个来源的数据,包括:
HTML5期末大作业:基于 html css js仿腾讯课堂首页
web学生网页设计
web前端 css dreamweaver html html5期末作业
精彩专栏推荐文末获取联系✍️作者简介:一个热爱把逻辑思维转变为代码的技术博主作者主页:【主页——获取更多优质源码】web前端期末大作业:【毕设项目精品实战案例(1000套)】程序员有趣的告白方式:【HTML七夕情人节表白网页制作(110套)】超炫酷的Echarts大屏可视化源码:【Echarts大屏展示大数据平台可视化(150套)】HTML+CSS+JS实例代码:【️HTML+CSS+JS实例代码
python天气数据分析与处理,用python数据分析天气
2401_84504019
人工智能
本篇文章给大家谈谈python天气预报可视化分析报告,以及基于python的天气预测系统研究,希望对各位有所帮助,不要忘了收藏本站喔。基于大数据重庆市气象数据分析摘要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对气象数据等问题,对气象信息进行研究分析,然后开发设计出气象数据分
Java本地缓存技术选型(Guava Cache、Caffeine、EhCache)
子龙技术
java
前言对一个java开发者而言,提到缓存,第一反应就是Redis。利用这类缓存足以解决大多数的性能问题了,我们也要知道,这种属于remotecache(分布式缓存),应用的进程和缓存的进程通常分布在不同的服务器上,不同进程之间通过RPC或HTTP的方式通信。这种缓存的优点是缓存和应用服务解耦,支持大数据量的存储,缺点是数据要经过网络传输,性能上会有一定损耗。与分布式缓存对应的是本地缓存,缓存的进程和
从0-1学习Mysql第七章: 分区与分库分表
一小路一
掌握 Go 语言:编程世界的进阶钥匙 学习 mysql 数据库 后端 面试
第七章:分区与分库分表在大数据时代,单个数据库或表往往难以应对海量数据带来的存储、查询和维护压力。分区、分表和分库分表技术正是在这种背景下应运而生。它们通过将数据进行逻辑或物理拆分,实现数据管理的灵活性和系统性能的优化。1.分区表的概念与使用场景1.1什么是分区表?分区表是将一个大表按照某种规则(如范围、列表、哈希等)划分为多个逻辑子表的技术。虽然物理上数据仍存储在同一张表内,但查询时数据库可以根
Spark之PySpark
james二次元
大数据 Spark Python PySpark
PySpark是ApacheSpark的PythonAPI,它允许开发者使用Python编程语言进行大规模数据处理和分析。ApacheSpark是一个快速、通用、可扩展的大数据处理引擎,支持批处理、流处理、机器学习、图计算等多种数据处理模式。PySpark使得Python开发者能够利用Spark强大的分布式计算能力,处理大数据集,并执行高效的并行计算。一、PySpark核心概念1.RDD(弹性分布
天气API接口在日常生活与商业决策中的应用
FB13713612741
python
天气,作为自然界中最不可控却又对人类活动影响巨大的因素之一,其变化无常的特性使得人们长期以来都在寻找预测和控制它的方法。随着科技的进步,尤其是互联网和大数据技术的发展,天气信息的获取和应用变得更加便捷和高效。天气API接口,作为连接天气数据与各类应用的桥梁,正逐步渗透到我们日常生活的方方面面,并在商业决策中发挥着越来越重要的作用。一、天气API接口的基本概念与技术原理天气API接口是一种提供天气数
大数据最全大模型入门到应用——LangChain:索引(Indexes)-[文本分割器
2401_84182507
程序员 langchain
分类目录:《大模型从入门到应用》总目录LangChain系列文章:基础知识快速入门安装与环境配置链(Chains)、代理(Agent:)和记忆(Memory)快速开发聊天模型模型(Models)基础知识大型语言模型(LLMs)基础知识LLM的异步API、自定义LLM包装器、虚假LLM和人类输入LLM(HumanInputLLM)缓存LLM的调用结果加载与保存LLM类、流式传输LLM与ChatMod
pandas series 相加_Numpy和Pandas教程
weixin_39778393
pandas series 相加
Pandas简介-python数据分析library-基于numpy(对ndarray的操作)-有一种用python做Excel/SQL/R的感觉-为什么要学习pandas?-pandas和机器学习的关系,数据预处理,featureengineering。-pandas的DataFrame结构和大家在大数据部分见到的spark中的DataFrame非常类似。目录-numpy速成-Series-Da
2025届毕业设计选题参考,包含网站管理系统开发,微信小程序开发,APP开发,大数据分析,人工智能
平姐设计
计算机毕业设计选题清单 微信小程序 开发语言 人工智能 数据分析
网站开发选题:1、基于Java的企业食堂管理系统的设计与实现2、基于web的办公平台3、综合学工服务系统4、超市管理系统5、基于springboot的云笔记共享系统6、毕业生实习管理系统7、驾校预约管理系统8、基于Java的航空订票系统9、企业资源规划系统10、洗衣房预约管理系统的设计与实现11、桌面端有声小说12、基于Python的毕业生就业率分析管理系统的设计与实现13、基于VUE的富平县农产
十分钟了解大数据处理的五大关键技术及其应用
IT时代周刊
2019年5月 大数据 程序员 编程语言 hadoop
其中主要工作环节包括:♦大数据采集、♦大数据预处理、♦大数据存储及管理、♦大数据分析及挖掘、♦大数据展现和应用(大数据检索、大数据可视化、大数据应用、大数据安全等)。一、大数据采集技术数据是指通过RFID射频数据、传感器数据、社交网络交互数据及移动互联网数据等方式获得的各种类型的结构化、半结构化(或称之为弱结构化)及非结构化的海量数据,是大数据知识服务模型的根本。重点要突破分布式高速高可靠数据爬取
【FL0091】基于SSM和微信小程序的社区二手物品交易小程序
猿毕设
小程序 微信小程序 spring boot python 后端 java
博主介绍全网粉丝10W+,CSDN全栈领域优质创作者,博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发、文档编写、答疑辅导等。精彩专栏推荐订阅计算机毕业设计精品项目案例(持续更新)文末获取源码+数据库+文档感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以和学长沟
web报表工具FineReport常见的数据集报错错误代码和解释
老A不折腾
web报表 finereport 代码 可视化工具
在使用finereport制作报表,若预览发生错误,很多朋友便手忙脚乱不知所措了,其实没什么,只要看懂报错代码和含义,可以很快的排除错误,这里我就分享一下finereport的数据集报错错误代码和解释,如果有说的不准确的地方,也请各位小伙伴纠正一下。
NS-war-remote=错误代码\:1117 压缩部署不支持远程设计
NS_LayerReport_MultiDs=错误代码
Java的WeakReference与WeakHashMap
bylijinnan
java 弱引用
首先看看 WeakReference
wiki 上 Weak reference 的一个例子:
public class ReferenceTest {
public static void main(String[] args) throws InterruptedException {
WeakReference r = new Wea
Linux——(hostname)主机名与ip的映射
eksliang
linux hostname
一、 什么是主机名
无论在局域网还是INTERNET上,每台主机都有一个IP地址,是为了区分此台主机和彼台主机,也就是说IP地址就是主机的门牌号。但IP地址不方便记忆,所以又有了域名。域名只是在公网(INtERNET)中存在,每个域名都对应一个IP地址,但一个IP地址可有对应多个域名。域名类型 linuxsir.org 这样的;
主机名是用于什么的呢?
答:在一个局域网中,每台机器都有一个主
oracle 常用技巧
18289753290
oracle常用技巧 ①复制表结构和数据 create table temp_clientloginUser as select distinct userid from tbusrtloginlog ②仅复制数据 如果表结构一样 insert into mytable select * &nb
使用c3p0数据库连接池时出现com.mchange.v2.resourcepool.TimeoutException
酷的飞上天空
exception
有一个线上环境使用的是c3p0数据库,为外部提供接口服务。最近访问压力增大后台tomcat的日志里面频繁出现
com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResou
IT系统分析师如何学习大数据
蓝儿唯美
大数据
我是一名从事大数据项目的IT系统分析师。在深入这个项目前需要了解些什么呢?学习大数据的最佳方法就是先从了解信息系统是如何工作着手,尤其是数据库和基础设施。同样在开始前还需要了解大数据工具,如Cloudera、Hadoop、Spark、Hive、Pig、Flume、Sqoop与Mesos。系 统分析师需要明白如何组织、管理和保护数据。在市面上有几十款数据管理产品可以用于管理数据。你的大数据数据库可能
spring学习——简介
a-john
spring
Spring是一个开源框架,是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只能由EJB完成的事情。然而Spring的用途不仅限于服务器端的开发,从简单性,可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。其主要特征是依赖注入、AOP、持久化、事务、SpringMVC以及Acegi Security
为了降低Java开发的复杂性,
自定义颜色的xml文件
aijuans
xml
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="white">#FFFFFF</color> <color name="black">#000000</color> &
运营到底是做什么的?
aoyouzi
运营到底是做什么的?
文章来源:夏叔叔(微信号:woshixiashushu),欢迎大家关注!很久没有动笔写点东西,近些日子,由于爱狗团产品上线,不断面试,经常会被问道一个问题。问:爱狗团的运营主要做什么?答:带着用户一起嗨。为什么是带着用户玩起来呢?究竟什么是运营?运营到底是做什么的?那么,我们先来回答一个更简单的问题——互联网公司对运营考核什么?以爱狗团为例,绝大部分的移动互联网公司,对运营部门的考核分为三块——用
js面向对象类和对象
百合不是茶
js 面向对象 函数创建类和对象
接触js已经有几个月了,但是对js的面向对象的一些概念根本就是模糊的,js是一种面向对象的语言 但又不像java一样有class,js不是严格的面向对象语言 ,js在java web开发的地位和java不相上下 ,其中web的数据的反馈现在主流的使用json,json的语法和js的类和属性的创建相似
下面介绍一些js的类和对象的创建的技术
一:类和对
web.xml之资源管理对象配置 resource-env-ref
bijian1013
java web.xml servlet
resource-env-ref元素来指定对管理对象的servlet引用的声明,该对象与servlet环境中的资源相关联
<resource-env-ref>
<resource-env-ref-name>资源名</resource-env-ref-name>
<resource-env-ref-type>查找资源时返回的资源类
Create a composite component with a custom namespace
sunjing
https://weblogs.java.net/blog/mriem/archive/2013/11/22/jsf-tip-45-create-composite-component-custom-namespace
When you developed a composite component the namespace you would be seeing would
【MongoDB学习笔记十二】Mongo副本集服务器角色之Arbiter
bit1129
mongodb
一、复本集为什么要加入Arbiter这个角色 回答这个问题,要从复本集的存活条件和Aribter服务器的特性两方面来说。 什么是Artiber? An arbiter does
not have a copy of data set and
cannot become a primary. Replica sets may have arbiters to add a
Javascript开发笔记
白糖_
JavaScript
获取iframe内的元素
通常我们使用window.frames["frameId"].document.getElementById("divId").innerHTML这样的形式来获取iframe内的元素,这种写法在IE、safari、chrome下都是通过的,唯独在fireforx下不通过。其实jquery的contents方法提供了对if
Web浏览器Chrome打开一段时间后,运行alert无效
bozch
Web chorme alert 无效
今天在开发的时候,突然间发现alert在chrome浏览器就没法弹出了,很是怪异。
试了试其他浏览器,发现都是没有问题的。
开始想以为是chorme浏览器有啥机制导致的,就开始尝试各种代码让alert出来。尝试结果是仍然没有显示出来。
这样开发的结果,如果客户在使用的时候没有提示,那会带来致命的体验。哎,没啥办法了 就关闭浏览器重启。
结果就好了,这也太怪异了。难道是cho
编程之美-高效地安排会议 图着色问题 贪心算法
bylijinnan
编程之美
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class GraphColoringProblem {
/**编程之美 高效地安排会议 图着色问题 贪心算法
* 假设要用很多个教室对一组
机器学习相关概念和开发工具
chenbowen00
算法 matlab 机器学习
基本概念:
机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。
它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。
开发工具
M
[宇宙经济学]关于在太空建立永久定居点的可能性
comsci
经济
大家都知道,地球上的房地产都比较昂贵,而且土地证经常会因为新的政府的意志而变幻文本格式........
所以,在地球议会尚不具有在太空行使法律和权力的力量之前,我们外太阳系统的友好联盟可以考虑在地月系的某些引力平衡点上面,修建规模较大的定居点
oracle 11g database control 证书错误
daizj
oracle 证书错误 oracle 11G 安装
oracle 11g database control 证书错误
win7 安装完oracle11后打开 Database control 后,会打开em管理页面,提示证书错误,点“继续浏览此网站”,还是会继续停留在证书错误页面
解决办法:
是 KB2661254 这个更新补丁引起的,它限制了 RSA 密钥位长度少于 1024 位的证书的使用。具体可以看微软官方公告:
Java I/O之用FilenameFilter实现根据文件扩展名删除文件
游其是你
FilenameFilter
在Java中,你可以通过实现FilenameFilter类并重写accept(File dir, String name) 方法实现文件过滤功能。
在这个例子中,我们向你展示在“c:\\folder”路径下列出所有“.txt”格式的文件并删除。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
C语言数组的简单以及一维数组的简单排序算法示例,二维数组简单示例
dcj3sjt126com
c array
# include <stdio.h>
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
//a 是数组的名字 5是表示数组元素的个数,并且这五个元素分别用a[0], a[1]...a[4]
int i;
for (i=0; i<5; ++i)
printf("%d\n",
PRIMARY, INDEX, UNIQUE 这3种是一类 PRIMARY 主键。 就是 唯一 且 不能为空。 INDEX 索引,普通的 UNIQUE 唯一索引
dcj3sjt126com
primary
PRIMARY, INDEX, UNIQUE 这3种是一类PRIMARY 主键。 就是 唯一 且 不能为空。INDEX 索引,普通的UNIQUE 唯一索引。 不允许有重复。FULLTEXT 是全文索引,用于在一篇文章中,检索文本信息的。举个例子来说,比如你在为某商场做一个会员卡的系统。这个系统有一个会员表有下列字段:会员编号 INT会员姓名
java集合辅助类 Collections、Arrays
shuizhaosi888
Collections Arrays HashCode
Arrays、Collections
1 )数组集合之间转换
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
a)Arrays.asL
Spring Security(10)——退出登录logout
234390216
logout Spring Security 退出登录 logout-url LogoutFilter
要实现退出登录的功能我们需要在http元素下定义logout元素,这样Spring Security将自动为我们添加用于处理退出登录的过滤器LogoutFilter到FilterChain。当我们指定了http元素的auto-config属性为true时logout定义是会自动配置的,此时我们默认退出登录的URL为“/j_spring_secu
透过源码学前端 之 Backbone 三 Model
逐行分析JS源代码
backbone 源码分析 js学习
Backbone 分析第三部分 Model
概述: Model 提供了数据存储,将数据以JSON的形式保存在 Model的 attributes里,
但重点功能在于其提供了一套功能强大,使用简单的存、取、删、改数据方法,并在不同的操作里加了相应的监听事件,
如每次修改添加里都会触发 change,这在据模型变动来修改视图时很常用,并且与collection建立了关联。
SpringMVC源码总结(七)mvc:annotation-driven中的HttpMessageConverter
乒乓狂魔
springMVC
这一篇文章主要介绍下HttpMessageConverter整个注册过程包含自定义的HttpMessageConverter,然后对一些HttpMessageConverter进行具体介绍。
HttpMessageConverter接口介绍:
public interface HttpMessageConverter<T> {
/**
* Indicate
分布式基础知识和算法理论
bluky999
算法 zookeeper 分布式 一致性哈希 paxos
分布式基础知识和算法理论
BY NODEXY@2014.8.12
本文永久链接:http://nodex.iteye.com/blog/2103218
在大数据的背景下,不管是做存储,做搜索,做数据分析,或者做产品或服务本身,面向互联网和移动互联网用户,已经不可避免地要面对分布式环境。笔者在此收录一些分布式相关的基础知识和算法理论介绍,在完善自我知识体系的同
Android Studio的.gitignore以及gitignore无效的解决
bell0901
android gitignore
github上.gitignore模板合集,里面有各种.gitignore : https://github.com/github/gitignore
自己用的Android Studio下项目的.gitignore文件,对github上的android.gitignore添加了
# OSX files //mac os下 .DS_Store
成为高级程序员的10个步骤
tomcat_oracle
编程
What
软件工程师的职业生涯要历经以下几个阶段:初级、中级,最后才是高级。这篇文章主要是讲如何通过 10 个步骤助你成为一名高级软件工程师。
Why
得到更多的报酬!因为你的薪水会随着你水平的提高而增加
提升你的职业生涯。成为了高级软件工程师之后,就可以朝着架构师、团队负责人、CTO 等职位前进
历经更大的挑战。随着你的成长,各种影响力也会提高。
mongdb在linux下的安装
xtuhcy
mongodb linux
一、查询linux版本号:
lsb_release -a
LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noa