在工作中需要自定义一个UDF类,在hive中对手机号解析,得到手机号的归属地和运营商.在网上查找许久,有的API已经过时有的需要申请注册并且还有次数等一些限制,最终选定了某度的免费API
"http://mobsec-dianhua.baidu.com/dianhua_api/open/location?tel=" + mobileNumber;
目前还没遇到次数限制也不需要过多的其他条件,只需要通过对API返回的JSON结果进行分析来得到需要的内容.
public static String getMobileCity(String mobileNumber) {
//百度的API地址
String urlString = "http://mobsec-dianhua.baidu.com/dianhua_api/open/location?tel=" + mobileNumber;
StringBuilder sb = new StringBuilder();
BufferedReader buffer;
String provinces = "";
String city = "";
String operators = "";
try {
URL url = new URL(urlString);
//获取URL地址中的页面内容
InputStream in = url.openStream();
// 解决乱码问题
buffer = new BufferedReader(new InputStreamReader(in, "utf8"));
String line = null;
//一行一行的读取数据
while ((line = buffer.readLine()) != null) {
sb.append(line);
}
in.close();
buffer.close();
//定义字符串
// String objectStr = "{"response":{"***********":{"detail":{"area":[{"city":"开封"}],"province":"河南","type":"domestic","operator":"移动"},"location":"河南开封移动"}},"responseHeader":{"status":200,"time":1532934563306,"version":"1.1.0"}}";
//1、使用JSONObject
JSONObject jsonObject2 = JSONObject.parseObject(sb.toString());
String result = jsonObject2.getString("response");
// 使用fastjson的parseObject方法将json字符串转换成Map
LinkedHashMap<String, String> jsonMap = JSON.parseObject(result, new TypeReference<LinkedHashMap<String, String>>() {
});
for (Map.Entry<String, String> entry : jsonMap.entrySet()) {
String value = entry.getValue();
LinkedHashMap<String, String> jsonMap1 = JSON.parseObject(value, new TypeReference<LinkedHashMap<String, String>>() {
});
for (Map.Entry<String, String> entry1 : jsonMap1.entrySet()) {
if (entry1.getKey().equals("detail")) {
String value1 = entry1.getValue();
LinkedHashMap<String, String> jsonMap2 = JSON.parseObject(value1, new TypeReference<LinkedHashMap<String, String>>() {
});
for (Map.Entry<String, String> entry2 : jsonMap2.entrySet()) {
if (entry2.getKey().equals("province")) {
provinces = entry2.getValue();
}
if (entry2.getKey().equals("operator")) {
operators = entry2.getValue();
}
if (entry2.getKey().equals("area")) {
String value2 = entry2.getValue();
String value3 = value2.substring(1, value2.length() - 1);
LinkedHashMap<String, String> jsonMap3 = JSON.parseObject(value3, new TypeReference<LinkedHashMap<String, String>>() {
});
for (Map.Entry<String, String> entry3 : jsonMap3.entrySet()) {
city = entry3.getValue();
}
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
//从JSONObject对象中读取城市名称
return provinces+" "+city+" "+operators;
}
}
因本人知识有限,没有考虑优化, 希望各位多提一些改进的意见,谢谢大家~