我有一些电话记录的以下数据,我想从每个记录中删除前两个值,因为它们是国家/地区代码。谁能让我知道使用scala,spark或Hive进行此操作的方式。
DrawMargins = (drawMargins)LayoutInflater.from(context).inflate(R.layout.activity_live_preview,null).findViewById(R.id.Draw);
Margin eyeNose = new Margin(marginX(),marginY());
Margin drawOnScreen = onScreen(correspondingOnScreen(eyeNose,NEMargin,SEMargin,SWMargin,NWMargin,0),0,8,0,8,0 );
DrawMargins.updateMargin(drawOnScreen);
我希望结果是:
phone
|917799423934|
|019331224595|
| 8981251522|
|917271767899|
如何从该列的每条记录或每一行中删除前缀91,01。
答案 0 :(得分:1)
我相信有一个改进,它希望包含或包含等价物的列表,但是这里有:
import org.apache.spark.sql.functions._
case class Tel(telnum: String)
val ds = Seq(
Tel("917799423934"),
Tel("019331224595"),
Tel("8981251522"),
Tel("+4553")).toDS()
val ds2 = ds.withColumn("new_telnum", when(expr("substring(telnum,1,2)") === "91" || expr("substring(telnum,1,2)") === "01", expr("substring(telnum,3,length(telnum)-2)")).otherwise(col("telnum")))
ds2.show
返回:
+------------+----------+
| telnum|new_telnum|
+------------+----------+
|917799423934|7799423934|
|019331224595|9331224595|
| 8981251522|8981251522|
| +4553| +4553|
+------------+----------+
我们可能需要考虑+,但没有说明。
答案 1 :(得分:0)
电话大小可以不同,可以使用这种构造(Scala):
df.withColumn("phone", expr("substring(phone,3,length(phone)-2)"))
答案 2 :(得分:0)
如果它们是字符串,则用于Hive查询:
sql("select substring(phone,3) from table").show
答案 3 :(得分:0)
使用正则表达式
使用regexp_replace
(如有必要,添加更多扩展代码):
select regexp_replace(trim(phone),'^(91|01)','') as phone --removes leading 91, 01 and all leading and trailing spaces
from table;
与regexp_extract
相同:
select regexp_extract(trim(phone),'^(91|01)?(\\d+)',2) as phone --removes leading and trailing spaces, extract numbers except first (91 or 01)
from table;