用户画像中特征和标签的区别

用户画像中有另个概念比较重要,特征和标签,如和区分呢,网上有个介绍,感觉比较形象,在此记录一下。

一、标签包含有特征。

一个标签可以包含有很多特征,比如说公知公知就是公共知识分子,公知是对有目的性引导舆论或自以为是地发表不成熟的批判言论,并自诩为“公共知识分子”的特定人群的特殊化简称。公共知识分子(The Public Intellectual),精确定义是具有学术背景和专业素质的知识者,进言社会并参与公共事务的行动者,具有批判精神和道义担当的理想者。而公知所代指人群缺乏作为公共知识分子所需学术性、专业性、客观公正的批判精神及道义担当。如今的网络社会,这些公知有目的性引导舆论或自以为是地发表不成熟的批判言论,并自诩为“公共知识分子”,使“公共知识分子”的形象受到了颠覆。

归纳一下:首先公知是一个变化的概念,由公共知识分子,变化为公知。
标签1:公共知识分子特征:具有专业知识/学术能力,积极参与社会事务,具有道德素质。(我不觉得必须要批判,非得要批判那叫闲的蛋疼。)
标签2:公知特征:不具有专业知识/学术能力,积极参与社会事务,不具有道德素质。(这里就有问题了,这些公知会喜欢批判的只是中国啊。)
如果把公知这个标签贴给某人,那么就意味着指认他基本同时具备这三条特征。

二、标签除了是多个特征的集合外,还同时覆盖多个目标。标签本来就是为了贴给多个目标的(特征当然也可以)。这就使得标签特别容易出现问题。举个例子,就是:中国产品(质量差,价格低,产量大,技术含量低)。
XX产品是中国生产的。
XX产品质量差。
结果就是贴标签的行为会有各种不相符的问题。
用的谨慎,标签是很好的工具,但是现实中嘛……

Linux Expect一键登录服务器

之前每次登录服务器都是这样的。
1.先登录堡垒机
2.选择服务器
3.输入服务器名或编号
4.先切换到root用户
5.再切换到hdfs用户
具体登录过程如下图(红框的位置需要手动输入内容):
具体登录过程
如此这样的话,每一次登录服务器,进行hadoop操作,都需要进行5步操作,如果密码不记得,还得拷贝密码,甚是麻烦,也非常的耽误时间,影响工作效率。

今天研究了一些Linux的expect自动登录功能,非常好用,在这里可以大显身手。先贴一下代码,其中的秘钥,用户名和密码需要替换成自己的。还有expect的内容和send的内容也要根据自己的实际情况进行替换。

1
2
3
4
5
6
7
8
9
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

#!/usr/bin/expect
set user wangjunbo
set host 13.6.6.9
set password RFCQQ
spawn ssh -i /Users/Documents/company/xxx.pem $user@$host
expect "*passphrase*"
send "$password\r"
if { $argc == 0 } {
set seq 1
}
if { $argc == 1 } {
#puts "not two"
set seq [lindex $argv 0]
}

if { $seq != "lll" } {

expect "*ID>*"
if { $seq == 1 || $seq == 2 } {
send "hadoop00$seq\n"
} else {
send "$seq\n"
}

expect "ops*"
send "sudo su -\n"

if { $seq == 1 || $seq == 2 } {
expect "*root@hadoop*"
send "su - hdfs\n"
if { $seq == 1 } {
expect "*hdfs@hadoop*"
send "cd shell/new/\n"
} elseif { $seq == 2 } {
expect "*hdfs@hadoop*"
send "cd /data/work/shell/\n"
}
} elseif { $seq == "app001" || $seq == "app002" } {
expect "root*"
send "cd /data/apps/recommend/\n"
}
}

interact
expect eof

$argc == 0的意思是如果没有参数,那么就默认登录hadoop001服务器。
$argc == 1的意思是如果有一个参数,就去第一个参数[lindex $argv 0]作为登录服务器名。
“ if { $argc == 0 } { “ 后边的}{之间一定要有一个空格,否则会报错“extra characters after close-brace”。
将上边的内容修改后保存为/usr/local/bin/lg文件,可能还需要使切换到root用户(Mac用户使用sudo su -切换到root用户)。
修改权限

1
chmod 777 /usr/local/bin/lg

如果不放到/usr/local/bin/目录下,在其它目录下执行,需要使用如下的方式

1
./lg

而不能用如下的方式

1
sh lg

然后使用直接在命令行使用lg进行登录:

下边是具体的效果:
具体登录过程

整个过程就输入了一个lg,然后回车就可以了,是不是很方便。

Python爬虫工具selenium

最新chromedriver下载地址

解压下载的chromedriver_mac64.zip, 得到chromedriver
切换到root用户下
然后将chromedriver移动到/usr/bin/目录下
然后就可以使用webdriver了

1
2
3
4
5
6
7
chromeOptions1 = Options()
# chromeOptions1.add_argument("--headless")
driver = webdriver.Chrome(chrome_options =chromeOptions1)
driver.get(uri)
print(driver.title)
# driver.find_element_by_id("k").get_attribute()
divs=driver.find_element_by_class_name("community-wrap").find_elements_by_class_name("list-item")

Mac使用iterm2使.bashrc永久生效

由于在~/.bashrc中添加了几条alias,每次打开命令行窗口,都需要重新source ~/.bashrc才能生效。
要想让添加的alias永久生效,方法如下:
vim ~/.bash_profile,加入source ~/.bashrc解决问题。
可能.bash_profile不存在,自己创建一个就好了。

Python发送钉钉消息

使用程序给钉钉发消息,目前看起来只能通过群机器人的方式,先获取机器人的token,然后在程序里调用。

如果想给个人发送消息,就先拉个人建一个钉钉群,然后将别人踢掉,就剩自己了,就可以只有自己接收消息了。
如果用的Mac,先切换到root用户

1
sudo su -

输入密码后,使用如下命令安装钉钉的Python依赖。

1
pip install DingtalkChatbot

以下是使用python进行钉钉消息的代码示例:

1
2
3
4
5
6
7
8
9
from dingtalkchatbot.chatbot import DingtalkChatbot
# WebHook地址
webhook = 'https://oapi.dingtalk.com/robot/send?access_token=sdfs1c5711212e62ada4b25b88b17966d65'
# 初始化机器人小丁
xiaoding = DingtalkChatbot(webhook)
# Text消息@所有人
at_mobiles=['18655398189']
to = '0289806f09dc2baaaf098555790a492e11c5711212e62ada4b25b88b17966d65'
xiaoding.send_text(msg='我就是小丁,小丁就是我!', is_at_all=False,at_mobiles=at_mobiles)

使用shell的方式发送钉钉消息

钉钉提供了Webhook协议的自定义接入。使用命令行方式发送钉钉消息的代码示例如下:

1
2
3
4
5
6
7
8
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \
-H 'Content-Type: application/json' \
-d '
{"msgtype": "text",
"text": {
"content": "欢迎访问 hohode.com"
}
}'

参考 http://zhangchuzhao.site/2018/01/23/dingtalk-chatbot/

Impala报错信息

RPC client failed to connect: Couldn’t open transport for hadoop007:22000 (connect() failed: 拒绝连接)

可能是元数据信息的问题,在hue Impala上刷新依稀元数据信息就可以了。

Spark将数据写入mysql

使用shell,添加mysql jar

1
/data/work/spark-2.2/bin/spark-shell --master yarn --executor-memory 5G --num-executors 5 --jars  /jars/mysql-connector-java-5.1.35.jar

Spark向mysql写入数据的具体代码

1
2
3
4
5
6
7
8
9
10
11
val df = spark.read.json("/data/log/log2018070319_0001.snappy")
val prop = new java.util.Properties
prop.setProperty("driver", "com.mysql.jdbc.Driver")
prop.setProperty("user", "root")
prop.setProperty("password", "123456")
//jdbc mysql url - destination database is named "data"
val url = "jdbc:mysql://hohode.com:13306/sp"
//destination database table
val table = "sample_test"
//write data from spark dataframe to database
df.limit(10).write.mode("append").jdbc(url, table, prop)

reference

Git比较两个分支的文件的差异

Git diff branch1 branch2 –stat //显示出所有有差异的文件列表

Git diff branch1 branch2 文件名(带路径) //显示指定文件的详细差异

Git diff branch1 branch2 //显示出所有有差异的文件的详细差异