2016年1月18日星期一

Source Insight中解决C++无法解析proto文件的问题

选择Options -> Preferences...,在Languages标签中双击C++ Language,点击Custom Parsing,然后Add一个Class,如图所示:
内容如下:
Namespace    ^package\w+\([a-zA-Z0-9_]+\)
Class    ^message\w+\([a-zA-Z0-9_]+\)
点击确定,re-parse project。
正则表达式参考:link.

选择Options -> Document Options...,在C++ Source File的File filter中增加*.proto,完成。

这个方法只能将就用,遇到 :: 不能解决。

现在看来,感觉也没什么卵用,直接把proto文件编译出来就可以了。

2016年1月15日星期五

Spark DataFrame的join操作

case class App(id: Int, name: String)
val data1 = sc.parallelize(Array((1, "a"), (2, "b"), (3, "c")))
val df1 = data.map { case (id, name) => App(id, name) }.toDF
val data2 = sc.parallelize(Array((1, "A"), (3, "B"), (5, "C")))
val df2 = data.map { case (id, name) => App(id, name) }.toDF

df1.show()
+---+----+
| id|name|
+---+----+
|  1|   a|
|  2|   b|
|  3|   c|
+---+----+

df2.show()
+---+----+
| id|name|
+---+----+
|  1|   A|
|  3|   B|
|  5|   C|
+---+----+

df1.join(df2)  // Cartesian join

df1.join(df2, "id")
+---+----+----+
| id|name|name|
+---+----+----+
|  1|   a|   A|
|  3|   c|   B|
+---+----+----+

df1.join(df2, df1("id") === df2("id")).show()
+---+----+---+----+
| id|name| id|name|
+---+----+---+----+
|  1|   a|  1|   A|
|  3|   c|  3|   B|
+---+----+---+----+

df1.join(df2, df1("id") === df2("id")).drop(df2("id")).show()
+---+----+----+
| id|name|name|
+---+----+----+
|  1|   a|   A|
|  3|   c|   B|
+---+----+----+

MySQL的基本操作

Please see this doc.

Spark SQL中DataFrame的几种写入模式

dataFrame.write.mode("xxx")进行设置

append
不改变表中已经存在记录,将新纪录写入。

overwrite
原来的记录全部删除,只有增加的记录。
举个例子:如果原来的表中有三个字段a, b, c,Overwrite的数据中只有两个字段a, b,那么原来c字段就没有了,慎用。

error
如果已经存在记录,抛出异常。

ignore
如果有已经存在的记录,DataFrame中的数据全部不会写入。

Spark SQL

关于Spark SQL,参考:link.

如果遇到 java.sql.SQLException: No suitable driver found for jdbc:mysql 问题,增加以下代码Class.forName("com.mysql.jdbc.Driver"),参考链接:link.

运行上一句代码时会出现 spark java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 错误,需要设置jar包的路径指向mysql-connector-java-5.1.38-bin.jar:
./spark-submit --jars <path to jar>
如果在spark-shell或者standalone模式中运行,同样用--jars参数指定mysql-connector-java-5.1.38-bin.jar的路径。

如果不起作用的话,同时加入--driver-class-path <path to jar>设置。
如果再不行,再加上--conf spark.executor.extraClassPath=<path to jar>以及--conf spark.driver.extraClassPath=<path to jar>设置。参考链接:link.

2016年1月5日星期二

Spark读取jar包中的文件

直接附上我的示例代码:
package com.mobvoi.app.recommendation.data

import java.io.InputStream

import scala.io.Source.fromInputStream

trait AppNameData extends Serializable {
  @transient private val stream: InputStream = getClass.getResourceAsStream("/app_name.txt")

  private val appIdName = fromInputStream(stream).getLines.toArray

  /** Param for app id and app name map. */
  private[recommendation] val appIdNameMap = appIdName.map { x =>
    val str = x.split("   ")
    (str(0).trim, str(1).trim)
  }.toMap

  /** Param for app name and app id map. */
  private[recommendation] val appNameIdMap = appIdName.map { x =>
    val str = x.split("   ")
    (str(1).trim, str(0).trim)
  }.toMap
}