目录
本篇文章记录各区域热门商品统计-关联商品信息并使用自定义get_json_object()。
代码
product
GetJsonObjectUDF.java
package graduation.java.spark.product; import com.alibaba.fastjson.JSONObject; import org.apache.spark.sql.api.java.UDF2; /** * FileName: GetJsonObjectUDF * Author: hadoop * Email: 3165845957@qq.com * Date: 19-4-1 下午10:20 * Description: * get_json_object() * * 技术点:自定义UDF函数 */ public class GetJsonObjectUDF implements UDF2<String,String,String> { private static final long serialVersionUID = 1L; @Override public String call(String json, String field) throws Exception { try{ JSONObject jsonObject = JSONObject.parseObject(json); return jsonObject.getString(field); }catch (Exception e) { e.printStackTrace(); } return null; } }
AreaTop3ProductSpark.java
/** * 生成区域商品点击次数临时表(包含了商品的完整信息) * @param sqlContext */ private static void generateTempAreaFullProductClickCountTable(SQLContext sqlContext){ // 将之前得到的各区域各商品点击次数表,product_id // 去关联商品信息表,product_id,product_name和product_status // product_status要特殊处理,0,1,分别代表了自营和第三方的商品,放在了一个json串里面 // get_json_object()函数,可以从json串中获取指定的字段的值 // if()函数,判断,如果product_status是0,那么就是自营商品;如果是1,那么就是第三方商品 // area, product_id, click_count, city_infos, product_name, product_status // 为什么要费时费力,计算出来商品经营类型 // 你拿到到了某个区域top3热门的商品,那么其实这个商品是自营的,还是第三方的 // 其实是很重要的一件事 // 技术点:内置if函数的使用 String sql = "SELECT " + "tapcc.area, " + "tapcc.product_id, " + "tapcc.click_count, " + "tapcc.city_infos, " + "pi.product_name, " + "if(get_json_object(pi.extend_info,'product_status ')=0,'自营商品','第三方商品') product_status " + "FROM tmp_area_product_click_count tapcc " + "JOIN product_info pi ON tapcc.procuct_id = pi.product_id"; Dataset ds = sqlContext.sql(sql); ds.registerTempTable("tmp_area_fullprod_click_count"); }