前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何使用Flume准实时建立Solr的全文索引

如何使用Flume准实时建立Solr的全文索引

作者头像
Fayson
发布于 2018-07-12 07:05:50
发布于 2018-07-12 07:05:50
1.6K00
代码可运行
举报
文章被收录于专栏:Hadoop实操Hadoop实操
运行总次数:0
代码可运行

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github:https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢

1.文档编写目的


Fayson在上篇文章《如何在CDH中使用Solr对HDFS中的JSON数据建立全文索引》简单介绍了Solr,然后利用Cloudera提供的Morphline工具通过创建MapReduce可以实现对HDFS中的半/非结构化数据的批量建立全文索引。本文主要介绍如何使用Morphline工具通过Flume实时的对数据建立全文索引。

  • 内容概述

1.索引建立流程

2.准备数据

3.在Solr中建立collection

4.编辑Morphline配置文件

5.启动Flume监听并实时建立索引

6.查询验证

  • 测试环境

1.RedHat7.4

2.CM5.14.3

3.CDH5.14.2

4.Solr4.10.3

5.集群未启用Kerberos

  • 前置条件

1.Solr服务已经安装并运行正常

2.Hue中已经配置集成Solr服务

2.索引建立流程


见下图为本文档将要讲述的使用Solr建立全文索引的过程:

1.先将准备好的半/非结构化数据放置在本地。

2.在Solr中建立collection,这里需要定义一个schema文件对应到本文要使用的json数据,需要注意格式对应。

3.修改Morphline的配置文件,使用Morphline解析json的功能。

4.配置flume的conf文件,使用MorphlineSolrSink,并配置指向到Morphline配置文件

5.启动flume agent的监听任务

6.启动flume的avro-client开始发送之前准备好的数据文件

Cloudera Search提供了一个比较方便的工具可以基于HDFS中的数据批量建立索引。见上图称作MapReduce Indexing Job,是属于Morphlines的一部分。

Morphline Commands是Cloudera Search项目的一部分,实现了Flume、MapReduce、HBaseSpark到Apache Solr的数据ETL。Morphline可以让你很方便的只通过使用配置文件,较为方便的解析如csv,json,avro等数据文件,并进行ETL入库到HDFS,并同时建立Solr的全文索引。从而避免了需要编写一些复杂的代码。

3.准备数据


1.准备生成一些json格式的样例数据,生成数据的Java代码如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.cloudera;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class GenerateSolrTestData {
    public static long getId() {
        return (long) (Math.random() * 1000000000000l);
    }
    public static String getRadomCOLLECTIONDATE() {
        String year[] = { "2018" };
        String month[] = { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12" };
        String day[] = { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16",
                "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28" };
        String hour[] = { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14",
                "15", "16", "17", "18", "19", "20", "21", "22", "23" };
        String minute[] = { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14",
                "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31",
                "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48",
                "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59" };
        String second[] = { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14",
                "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31",
                "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48",
                "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59" };
        int index1 = (int) (Math.random() * year.length);
        int index2 = (int) (Math.random() * month.length);
        int index3 = (int) (Math.random() * day.length);
        int index4 = (int) (Math.random() * hour.length);
        int index5 = (int) (Math.random() * minute.length);
        int index6 = (int) (Math.random() * second.length);
        String coliectiondate = year[index1] + "-" + month[index2] + "-" + day[index3] + "T" + hour[index4] + ":"
                + minute[index5] + ":" + second[index6] + "Z";
        return coliectiondate;
    }
    public static String getRandomText() {
        String test[] = { "accumulo-core-1.6.0.jar", "accumulo-fate-1.6.0.jar", "accumulo-start-1.6.0.jar",
                "accumulo-trace-1.6.0.jar", "activation-1.1.jar", "activemq-client-5.10.2.jar",
                "akka-actor_2.10-2.2.3-shaded-protobuf.jar", "akka-remote_2.10-2.2.3-shaded-protobuf.jar",
                "akka-slf4j_2.10-2.2.3-shaded-protobuf.jar", "akuma-1.9.jar", "algebird-core_2.10-0.6.0.jar"};
        int index1 = (int) (Math.random() * test.length);
        return test[index1];
    }
    public static String getRandomTextCh() {
        String test[] = {
                "贾玲,原名贾裕玲。1982年4月29日出生于湖北襄阳,毕业于中央戏剧学院。喜剧女演员,师从冯巩,发起并创立酷口相声。2003年获《全国相声小品邀请赛》相声一等奖。2006年《中央电视台》第三届相声大赛专业组二等奖。2009年7月,由贾玲、邹僧等人创办的新笑声客栈开张,成为酷口相声的大本营。2010年2月14日,贾玲首次登上央视春晚的舞台表演相声《大话捧逗》,并获“我最喜爱的春晚节目”曲艺组三等奖。2011年2月2日,再次登上央视春晚舞台,表演相声《芝麻开门》。",
                "要实现近实时搜索,就必须有一种机制来实时的处理数据然后生成到solr的索引中去,flume-ng刚好提供了这样一种机>制,它可以实时收集数据,然后通过MorphlineSolrSink对数据进行ETL,最后写入到solr的索引中,这样就能在solr搜索引擎中近实时的查询到新进来的数据了由贾玲人。",
                "如上图,每个缓冲区以四个字节开头,中间是多个字节的缓冲数据,最后以一个空缓冲区结尾。",
                "实际还是围绕着Agent的三个组件Source、Channel、Sink来看它能够支持哪些技术或协议。我们不再对各个组件支持的协议详细配置进行说明,通过列表的方式分别对三个组件进行概要说明",
                "下面写一个最简单的Hello World例子,以便对RESTful WebService有个感性认识。因为非常专业理论化的描述RESTful WebService是一件理解起来很痛苦的事情。看看例子就知道个大概了,再看理论就容易理解多了。",
                "据中国香港经济日报报道,传小米可能在下周向港交所提交上市申请。经济日报此前还报道,小米最近数月不乏上市前股东售股活动,售股价格显示公司估值介乎650亿至700亿美元。此前,曾有多个小米估值的版本出现,比如1000亿美元,甚至2000亿美元,小米方面都未进行置评",
                "最近,中超新晋土豪苏宁可谓是频出大手笔。夏窗尚未开启,苏宁就早早开始谋划了。", "尽管距离泰达与恒大的比赛还有2天的时间,但比赛的硝烟已经开始弥漫。",
                "据美国媒体报道,美国当地时间21日上午,流行音乐传奇人物王子(Prince)被发现死于位于明尼苏达的住所内,医务人员进行了紧急抢救,但最终回天无力,享年57岁。",
                "016年4月19日,周杰伦召开记者会,正式宣布:与杰藝文創合作,收购S2冠军战队台北暗杀星TPA,并正式更名为",
                "上周五,麦格希金融在一项声明中说,这笔交易预计在今年第三季度完成,目前正在等待监管部门的审批" };
        int index1 = (int) (Math.random() * test.length);
        return test[index1];
    }
    public static String getData() {
        StringBuffer sbf = new StringBuffer();
        sbf.append("{\"id\": \"" + getId() + "\",\"created_at\": \"" + getRadomCOLLECTIONDATE() + "\", \"text\": \""
                + getRandomText() + "\",\"text_cn\":\"" + getRandomTextCh() + "\"}");
        return sbf.toString();
    }
    public static void write(int n, String file) {
        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new FileWriter(file, true), 4194304);
            for (int i = 0; i < n; i++) {
                bw.write(getData() + "\r\n");
            }
            System.out.println("数据生成完毕!" + file);
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("数据生成异常!");
        } finally {
            try {
                bw.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        write(3000000, "/root/data1.txt");
    }
}

(可左右滑动)

因为Fayson的AWS环境配置较低,这里只作为实验生成300W行数据,大约100MB。

Fayson为了方便后面观察Flume实时入库并建立索引的效果,这里比上一篇文章的数据放大了10倍,否则数据太少,一下入库完毕,看不出实时的效果。

2.将Java代码打包成jar并上传到服务器执行,生成数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@ip-172-31-8-230 solr-hdfs]# java -cp GenerateSolrTestData.jar com.cloudera.GenerateSolrTestData
数据生成完毕!/root/data1.txt

(可左右滑动)

查看该数据,为300W行,1GB。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@ip-172-31-8-230 ~]# head data1.txt 
[root@ip-172-31-8-230 ~]# cat data1.txt |wc -l
[root@ip-172-31-8-230 ~]# du -sh data1.txt

(可左右滑动)

4.在Solr中建立collection


1.根据json文件准备schema文件。根据第三章的json格式数据内容可以看到一共有id,username,created_at,text,text_cn几个属性项。在Solr的collection的schema文件中都要有相应的对应,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.5">
<fields>
  <field name="uuuid" type="string" indexed="true" stored="true" required="true" multiValued="false" />
 <field name="id" type="string" indexed="true" stored="true" />
  <field name="created_at" type="string" indexed="true" stored="true" />
  <field name="text" type="text_en" indexed="true" stored="true" />
  <field name="text_cn" type="text_ch" indexed="true" stored="true" />
  <field name="_version_" type="long" indexed="true" stored="true"/>
</fields>
<uniqueKey>uuuid</uniqueKey>
<types>
<!-- The StrField type is not analyzed, but indexed/stored verbatim.
          It supports doc values but in that case the field needs to be
     single-valued and either required or have a default value.
     -->
<fieldType name="string" class="solr.StrField" sortMissingLast="true"/>
<!--
          Default numeric field types. For faster range queries, consider the tint/tfloat/tlong/tdouble types.
These fields support doc values, but they require the field to be
single-valued and either be required or have a default value.
-->
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100" /> 
<fieldType name="text_ch" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
         <tokenizer class="solr.SmartChineseSentenceTokenizerFactory"/>
         <filter class="solr.SmartChineseWordTokenFilterFactory"/>
        </analyzer>  
</fieldType>
</types>
</schema>

(可左右滑动)

注意Solr在建立全文索引的过程中,必须指定唯一键(uniqueKey),类似主键,唯一确定一行数据,跟上篇文章不一样,我们没有使用json中的id属性项,而选择了让solr自动生成,因为Fayson的造数代码是使用的Java,id那一列是随机数函数Math,数据量大了,没办法保持id的唯一性,所以采用了Solr来自动生成,更好的保持唯一性,该uuid会在Morphline配置文件中配置,大家可以继续往后查看Morphline配置文件章节进行对比。

schema文件中的字段类型定义,标准如int,string,long等这里不再说明,注意有两个类型text_cn,text_ch,主要对应到英文或者中文的文字内容,涉及到分词和全文检索技术。英文的分词和全文检索是默认自带的,中文的这里使用了一个开源的Solr的中文分词包lucene-analyzers-smartcn。下载地址为:

https://repository.cloudera.com/artifactory/cdh-releases-rcs/org/apache/lucene/lucene-analyzers-smartcn/4.10.3-cdh5.14.2/

2.准备建立collection的脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ZK="ip-172-31-5-171.ap-southeast-1.compute.internal"
COLLECTION="collection1"
BASE=`pwd`
SHARD=3
REPLICA=1
echo "create solr collection"
rm -rf tmp/*
solrctl --zk $ZK:2181/solr instancedir --generate tmp/${COLLECTION}_configs
cp conf/schema.xml tmp/${COLLECTION}_configs/conf/
solrctl --zk $ZK:2181/solr instancedir --create $COLLECTION tmp/${COLLECTION}_configs
solrctl --zk $ZK:2181/solr collection --create $COLLECTION -s $SHARD -r $REPLICA
solrctl --zk $ZK:2181/solr collection --list

(可左右滑动)

ZK:Zookeeper的某台机器的hostname

COLLECTION:需要建立的collection名字

SHARD:需要建立的shard的数量

REPLICA:副本数

3.执行create.sh脚本建立collection

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@ip-172-31-8-230 solr-hdfs]# sh create.sh 
create solr collection
Uploading configs from tmp/collection1_configs/conf to ip-172-31-5-171.ap-southeast-1.compute.internal:2181/solr. This may take up to a minute.
collection1 (2)

(可左右滑动)

5.编辑Morphline配置文件


1.准备Morphline的配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Specify server locations in a SOLR_LOCATOR variable; used later in   
# variable substitutions:  
SOLR_LOCATOR : {  
  # Name of solr collection  
  collection : collection1  
  # ZooKeeper ensemble  
  zkHost : "ip-172-31-5-171.ap-southeast-1.compute.internal:2181/solr"    
}  
# Specify an array of one or more morphlines, each of which defines an ETL   
# transformation chain. A morphline consists of one or more potentially   
# nested commands. A morphline is a way to consume records such as Flume events,   
# HDFS files or blocks, turn them into a stream of records, and pipe the stream   
# of records through a set of easily configurable transformations on its way to   
# Solr.  
morphlines : [  
  {  
    # Name used to identify a morphline. For example, used if there are multiple   
    # morphlines in a morphline config file.  
    id : morphline1   
    # Import all morphline commands in these java packages and their subpackages.  
    # Other commands that may be present on the classpath are not visible to this  
    # morphline.  
    importCommands : ["org.kitesdk.**", "org.apache.solr.**","com.cloudera.example.**"]  
    commands : [                      
      {  
        readJson {}  
      }  
      {   
        extractJsonPaths {  
          flatten : false  
          paths : {   
            id : /id              
            created_at : /created_at  
            text : /text        
            text_cn:/text_cn
          }  
        }  
      }  
{
        generateUUID {
            field:uuuid
        }
    }      
      # Consume the output record of the previous command and pipe another  
      # record downstream.  
      #  
      # convert timestamp field to native Solr timestamp format  
      # such as 2012-09-06T07:14:34Z to 2012-09-06T07:14:34.000Z  
      {  
        convertTimestamp {  
          field : created_at  
          inputFormats : ["yyyy-MM-dd'T'HH:mm:ss'Z'", "yyyy-MM-dd"]  
          inputTimezone : America/Los_Angeles  
          outputFormat : "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"                                   
          outputTimezone : UTC  
        }  
      }  
      # Consume the output record of the previous command and pipe another  
      # record downstream.  
      #  
      # This command deletes record fields that are unknown to Solr   
      # schema.xml.  
      #  
      # Recall that Solr throws an exception on any attempt to load a document   
      # that contains a field that is not specified in schema.xml.  
      {  
        sanitizeUnknownSolrFields {  
          # Location from which to fetch Solr schema  
          solrLocator : ${SOLR_LOCATOR}  
        }  
      }    
      # log the record at DEBUG level to SLF4J  
      { logDebug { format : "output record: {}", args : ["@{}"] } }      
      # load the record into a Solr server or MapReduce Reducer  
      {   
        loadSolr {  
          solrLocator : ${SOLR_LOCATOR}  
        }  
      }  
    ]  
  }  
]  

(可左右滑动)

根据上图可以看到配置项里包括:

collection的名字,Zookeeper的地址

注意我们使用了readjson方法,然后对应到我们之前定义的schema文件里的json属性项

比上篇文章不一样的地方,我们引入了uuid,对应到第四章schema文件中的uuuid

6.下载分发中文分词jar包


1.将中文分词包拷贝到指定的目录,首先到以下网址下载中文分词的jar包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://repository.cloudera.com/artifactory/cdh-releases-rcs/org/apache/lucene/lucene-analyzers-smartcn/4.10.3-cdh5.14.2/

(可左右滑动)

将中文分词jar包分发到所有机器的Solr和YARN服务相关的目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@ip-172-31-8-230 solr-hdfs]# cp lucene-analyzers-smartcn-4.10.3-cdh5.14.2.jar /opt/cloudera/parcels/CDH/lib/hadoop-yarn
[root@ip-172-31-8-230 solr-hdfs]# cp lucene-analyzers-smartcn-4.10.3-cdh5.14.2.jar /opt/cloudera/parcels/CDH/lib/solr/webapps/solr/WEB-INF/lib

(可左右滑动)

2.分发到集群所有机器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@ip-172-31-8-230 shell]# sh bk_cp.sh node.list  /opt/cloudera/parcels/CDH/lib/hadoop-yarn/lucene-analyzers-smartcn-4.10.3-cdh5.14.2.jar  /opt/cloudera/parcels/CDH/lib/hadoop-yarn
lucene-analyzers-smartcn-4.10.3-cdh5.14.2.jar          
[root@ip-172-31-8-230 shell]# sh bk_cp.sh node.list /opt/cloudera/parcels/CDH/lib/solr/webapps/solr/WEB-INF/lib/lucene-analyzers-smartcn-4.10.3-cdh5.14.2.jar /opt/cloudera/parcels/CDH/lib/solr/webapps/solr/WEB-INF/lib

(可左右滑动)

7.启动Flume监听并实时建立索引


1.配置Flume监听启动时需要使用的配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@ip-172-31-8-230 conf]# cat flume-solr.conf 
tier1.sources=source1
tier1.channels=channel1
tier1.sinks=sink1
tier1.sources.source1.type = avro
tier1.sources.source1.bind = 0.0.0.0
tier1.sources.source1.port = 44444
tier1.sources.source1.channels=channel1
tier1.channels.channel1.type=memory
tier1.channels.channel1.capacity=10000000
tier1.channels.channel1.transactionCapacity=10000
tier1.channels.channel1.keep-alive=60
tier1.sinks.sink1.type = org.apache.flume.sink.solr.morphline.MorphlineSolrSink
tier1.sinks.sink1.channel = channel1
tier1.sinks.sink1.morphlineFile =/root/solr-hdfs-flume/conf/morphlines.conf
tier1.sinks.sink1.morphlineId = morphline1

(可左右滑动)

2.启动Flume监听

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@ip-172-31-8-230 conf]# flume-ng agent --conf conf --conf-file flume-solr.conf --name tier1 -Xms1024m -Xmx2048m -Dflume.root.logger=INFO,console
Info: Including Hadoop libraries found via (/bin/hadoop) for HDFS access
Info: Including HBASE libraries found via (/bin/hbase) for HBASE access
Info: Including Hive libraries found via () for Hive access

(可左右滑动)

3.启动flume的avro client开始发送数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@ip-172-31-8-230 ~]# flume-ng avro-client -H localhost -p 44444 -F data1.txt

(可左右滑动)

4.使用Solr的查询界面可以实时的看到数据在慢慢进入Solr,并建立索引。

Flume的avro client发送数据完毕,已经关闭客户端。

Flume监听这边显示连接断开

入库数据约为176W,说明还在继续入库

再次等待一会,数据最终入库完毕,300W条。

8.Solr自带界面全文索引查询验证


1.从Cloudera Manger中选择Solr并进入其中一台Solr Server的界面

2.选择一个collection的shard并进入collection的查询界面

3.点击query按钮,准备开始查询数据

4.查询全部数据

5.得到查看结果是300W条,符合预期,表明所有数据都已经入库成功

6.查询关键字“实际”,发现查询结果会显示所有带有“实际”词语的条目,一共273250条。

9.使用Hue进行全文索引查询验证


1.进入Hue并选择“Indexes”页面

2.选择collection1

3.点击右上角放大镜查询图标

4.总数为300W条,符合预期

5.同样查询“实际”关键字,发现“实际”会被高亮,并且27453条符合预期,与第8节使用Solr自带界面查询的结果也是相符合的。

10.总结


1.使用Cloudera提供的Morphline工具,可以让你不需要编写一行代码,只需要通过使用一些配置文件就可以快速的对半/非机构化数据进行全文索引。而且还可以实现Flume的准实时建立索引

2.本文demo提供的中文分词是比较弱的,要想真正上生产使用,可以考虑使用更好的开源中文分词包或者其他第三方的。

3.注意如果全文索引的字段有需要做中文分词的,需要将中文分词的jar包上传到所有机器的Solr和YARN服务相关的目录。否则Solr会无法创建collection,YARN也无法启动创建索引的MapReduce任务。

4.本文只是以json格式的数据进行举例验证,实际Morphline还支持很多其他的格式,包括结构化数据csv,HBase中的数据等等。具体请参考:

5.如果数据文件没有唯一确定的id字段,类似主键,可以使用morphline的uuid功能,保证所有数据都能入库成功,否则可能导致数据丢失

http://kitesdk.org/docs/1.1.0/morphlines/

https://www.cloudera.com/documentation/enterprise/latest/topics/search.html

本文所有代码或脚本源码已上传到github,参考:

https://github.com/fayson/cdhproject/tree/master/generatedata/solr-hdfs-flume

https://github.com/fayson/cdhproject/blob/master/generatedata/src/main/java/com/cloudera/solr/GenerateSolrTestData.java

提示:代码块部分可以左右滑动查看噢 为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编程语言傻傻分不清:弱类型、强类型、动态类型、静态类型
这篇文章综合介绍了四种分类,特别地,为了方便大家快速有效的学习,笔者尝试用思维导图的办法描述编程语言的区别。一般来讲,看第一个图就够了。但如果你想更深入地了解,也可以参考下面的文字表述。
陈满iOS
2018/09/10
10.1K1
编程语言傻傻分不清:弱类型、强类型、动态类型、静态类型
编译型语言、解释型语言、静态类型语言、动态类型语言、强类型语言、弱类型语言概念与区别
编译型语言和解释型语言 1、编译型语言 需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。 优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。 缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的
Albert陈凯
2018/04/04
3.3K0
编程语言的弱类型、强类型、动态类型、静态类型的解释
例如在SQL语言中,当一个整数与一个浮点数相加时,系统会自动将整数转换为浮点数,以便进行运算并得到正确的结果;或者对int类型列 输入一个字符串类型,如果系统发现该字符串可以转化成int类型数字,则会将其自动转化成int类型数字
黎鹤舞
2024/03/19
8100
编程语言的弱类型、强类型、动态类型、静态类型的解释
你必须知道的编程语言分类
我们习惯把编程语言分类为机器语言(汇编语言)和高级语言(Fortran/Lisp/Cobol/Basic/C/Pascal /C++/Java/Perl/Python),选择使用高级语言编程而不是机器语言相信大家都能说出一两个理由(比汇编语言更容易和更清晰的表达性、多平台的可移植性,但需要一个专用的编译器或者是解释器)。
呱牛笔记
2023/05/02
7910
你必须知道的编程语言分类
通俗的方式理解动态类型,静态类型;强类型,弱类型
引言 今天和一个朋友讨论 C++ 是强类型还是弱类型的时候,他告诉我 C++ 是强类型的,他和我说因为 C++ 在写的时候需要 int,float 等等关键字去定义变量,因此 C++ 是强类型的,我告诉他 C++ 是弱类型的他竟然还嘲笑我不懂基础。 我又尝试去问了另外一个同学 Python 是强类型还是弱类型的时候,得到的竟然是弱类型,就因为定义变量没有 int,float! 然后我想找一些网上的资料试图告诉他们他们是错的(我是对的),结果发现网上的资料大多为了严谨结果把简单的问题(其实并不简单)说的很
桃翁
2018/06/27
2.3K0
[oeasy]python075_什么是_动态类型_静态类型_强类型_弱类型_编译_运行
age = 1 print(age, type(age)) age = "1" print(age, type(age))
oeasy
2025/03/18
981
[oeasy]python075_什么是_动态类型_静态类型_强类型_弱类型_编译_运行
弱类型、强类型、动态类型、静态类型语言的区别是什么
语言设计时,可以定义一组forbidden behaviors. 它必须包括所有untrapped errors, 但可能包含trapped errors.
用户8442333
2021/12/01
1.6K0
论编程界的日经问题:到底如何区分静态类型和动态类型、强类型和弱类型?
博主在本文中探讨了编程界常见的问题,即如何区分静态类型和动态类型,强类型和弱类型。他指出,由于这些概念本身没有明确的定义,导致人们很难就此达成一致共识。然而,如果按照已有的共识来界定这些概念,就能得出一些明确的答案。文章提到了强类型语言和弱类型语言的区别,以及静态类型语言和动态类型语言的区别。在强类型和弱类型的定义中,强类型语言常常会直接出错或编译失败,而弱类型语言会进行隐式转换或产生意料之外的结果。根据这个定义,Python被归类为强类型语言。静态类型语言在编译期确定变量类型,而动态类型语言在运行时确定。根据这个区别,C, C++, C#, Java等被视为静态类型语言,而Python, JavaScript, TypeScript, PHP等被视为动态类型语言。最后,博主表示这种讨论对工程开发的实际意义并不大。
HikariLan贺兰星辰
2023/10/18
4990
Python学到什么程度可以面试工作(解答)
逛知乎,看到帖子Python学到什么程度可以面试工作?,在桃花岛主的回答中讲到2019年最新的Python面试题,同时还有旭东大佬已做了大部分的解答。
python学习教程
2020/02/13
6660
Python学到什么程度可以面试工作(解答)
Python是一门什么语言
编程语言主要从以下几个角度为进行分类,编译型和解释型、静态语言和动态语言、强类型定义语言和弱类型定义语言,每个分类代表什么意思呢,下面我们一起看一下。
后场技术
2020/09/03
7550
Python是一门什么语言
python学习笔记(python发展介
·金融:量化交易,金融分析等,作为动态语言的python,语言结构清晰简单,库丰富,成熟稳定,科学计算和统计分析都很牛
py3study
2020/01/15
6630
Go是一门什么样的语言?
  首先Go语言诞生于2007年由谷歌公司研发,2009年开源,2012年推出1.0版本,Go是一种语言层面支持并发(Go最大的特色、天生支持并发)、内置runtime,支持垃圾回收(GC)、静态强类型,快速编译的语言(编译型语言)。
追逐时光者
2021/08/05
1.2K0
python3--python的出生与应用
python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。
py3study
2018/08/02
6400
JS进阶系列01-JS的弱类型和动态类型
首先,我们要弄清楚编程语言的两组划分,即弱类型和强类型,动态类型和静态类型。下面有一幅图,非常详细地说明了它们各自的定义和区别。
love丁酥酥
2018/08/27
2.4K0
JS进阶系列01-JS的弱类型和动态类型
Python之路--Python初识
python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。
py3study
2020/01/19
2.1K0
Python到底是强类型语言,还是弱类型语言?
我在上一篇文章中分析了 为什么 Python 没有 void 类型 的话题,在文章发布后,有读者跟我讨论起了另一个关于类型的问题,但是,我们很快就出现了重大分歧。
Python猫
2020/09/03
3.3K0
Python到底是强类型语言,还是弱类型语言?
谁告诉的你们Python是强类型语言!站出来,保证不打你!
最近有些学员问我,Python到底是强类型语言,还是弱类型语言。我就直接脱口而出:Python是弱类型语言。没想到有一些学员给我了一些文章,有中文的,有英文的,都说Python是强类型语言。我就很好奇,特意仔细研究了这些文章,例如,下面就是一篇老外写的文章:
蒙娜丽宁
2020/08/31
1.1K0
谁告诉的你们Python是强类型语言!站出来,保证不打你!
python介绍
python是一门优秀的综合语言,python的宗旨是简明,优雅,强大,在人工智能,云计算,金融分析,大数据开发,web开发,自动化运维,测试等方向应用广泛,已是全球第4大最流行的语言
py3study
2018/08/02
8270
函数式编程与面向对象编程[2]: 静态类型语言的表达力 静态类型语言与动态类型语言函数式编程与面向对象编程[2]: 静态类型语言的表达力 静态类型语言与动态类型语言
像Java或者C#这样强类型的准静态语言在实现复杂的业务逻辑、开发大型商业系统、以及那些生命周期很长的应用中也有着非常强的优势
一个会写诗的程序员
2018/08/20
1.5K0
函数式编程与面向对象编程[2]: 静态类型语言的表达力 静态类型语言与动态类型语言函数式编程与面向对象编程[2]: 静态类型语言的表达力 静态类型语言与动态类型语言
编程语言常识
选择哪种类型系统通常取决于项目的需求、开发者的偏好以及编程语言的特性。不同的语言类型系统适用于不同的情境,没有一种绝对更好的选择。
追逐时光者
2023/09/04
4230
编程语言常识
推荐阅读
相关推荐
编程语言傻傻分不清:弱类型、强类型、动态类型、静态类型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档