2017年10月30日星期一

pyspark中判断DataFrame是否为空

if df.head() is not None:
  xxx

mongodb启动问题

在配置中修改了dbPath,无法启动,需要将修改的dbPath的用户和组设置为mongodb:mongodb即可。

还有可能在日志里面发现socket permission的问题,删除/tmp/mongodb-27017.sock后再sudo service mongod start

2017年10月29日星期日

npm install 速度慢

换为国内镜像:
npm install --registry=http://registry.npm.taobao.org

永久设置:
npm config set registry http://registry.npm.taobao.org

ubuntu下E: Unable to locate package问题

刚安装了ubuntu 16.04系统,sudo apt install tmux时候遇到E: Unable to locate package tmux的问题,解决:
sudo apt-get update

2017年10月27日星期五

tensorflow serving 运算特别慢

之前从源码编译的方式安装了tensorflow serving,但是部署到线上发现特别吃cpu,并且速度很慢。根据https://github.com/tensorflow/serving/issues/456,猜测应该是编译选项设置的问题。

后来换成了通过apt-get安装方式的二进制文件,问题解决。

spark 2.1.0 from_json使用中的问题

对于以下代码,spark2.2.0运行正常:
import json
from pyspark.sql import functions as f
from pyspark.sql.types import ArrayType, DoubleType, StringType, StructField, StructType
from pyspark.sql.functions import from_json

def func(value, score):
  values = {}
  for i in range(len(value)):
    if value[i] in values:
      values[value[i]] = values[value[i]] + score[i]
    else:
      values[value[i]] = score[i]
  res = []
  for k, v in values.items():
    res.append({'value': k, 'score': v})
  return json.dumps(res, ensure_ascii=False)

x = [{'user' : '86209203000295', 'domain' : 'music', 'subdomain' : 'artist', 'value' : 'xxx', 'score' : 0.8, 'ts' : '1508737410941'}, {'user' : '86209203000295', 'domain' : 'music', 'subdomain' : 'artist', 'value' : 'yyy', 'score' : 0.9, 'ts' : '1508737410941'}, {'user' : '86209203000685', 'domain' : 'music', 'subdomain' : 'artist', 'value' : 'zzz', 'score' : 0.8, 'ts' : '1508717416320'}]
df = spark.createDataFrame(x)
df = df.groupBy(df['user'], df['domain'], df['subdomain']).agg(f.collect_list(df['value']).alias('value'), f.collect_list(df['score']).alias('score'))
df = df.select(df['user'], df['domain'], df['subdomain'], f.UserDefinedFunction(func, StringType())(df['value'], df['score']).alias('values'))
df.collect()
schema = ArrayType(StructType([StructField('value', StringType()), StructField('score', DoubleType())]))
df = df.select(df['user'], df['domain'], df['subdomain'], from_json(df['values'], schema).alias('values'))
df.collect()

但是spark2.1.0运行报错:java.lang.ClassCastException: org.apache.spark.sql.types.ArrayType cannot be cast to org.apache.spark.sql.types.StructType

这个问题比较坑,2.1.0不支持ArrayType。

2017年10月13日星期五

intellij添加python包

File -> Project Sturcture... 中先看下左侧的Modules中有没有添加Python的module,没有则先添加python module。

然后再点左侧的Global Libraries,添加需要的python source包目录即可。

例如,我进行pyspark开发,将spark-2.2.0-bin-hadoop2.7/python添加到source中,这样项目中就可以跳转到pyspark的代码并且有代码提示了。