2016-10-10 1 views
1

文字列内の一意のバイトを数えようとしていますか?ハイブを使用して文字列内の一意の整数を数えるには?

DATA(数字のみバイトの例えば電話番号):

1234567890 
1111111112 

結果:私は以下試してみました、それは合計ので動作しませんでした

10 
2 

()は、UDF 'の場合は'を受け入れません。

select phone 
, sum(
     cast(if(length(regexp_replace(phone,'0',''))<10,'1','0') as int) + 
     cast(if(length(regexp_replace(phone,'1',''))<10,'1','0') as int) + 
     cast(if(length(regexp_replace(phone,'2',''))<10,'1','0') as int) + 
     cast(if(length(regexp_replace(phone,'3',''))<10,'1','0') as int) + 
     cast(if(length(regexp_replace(phone,'4',''))<10,'1','0') as int) + 
     cast(if(length(regexp_replace(phone,'5',''))<10,'1','0') as int) + 
     cast(if(length(regexp_replace(phone,'6',''))<10,'1','0') as int) + 
     cast(if(length(regexp_replace(phone,'7',''))<10,'1','0') as int) + 
     cast(if(length(regexp_replace(phone,'8',''))<10,'1','0') as int) + 
     cast(if(length(regexp_replace(phone,'9',''))<10,'1','0') as int)   
     ) as unique_bytes 
from table; 

私は解決策として正規表現のいずれかに並んでいません。

答えて

2

+を使用してください。 。 。しかし、このように:

select phone, 
     ((case when phone like '%0%' then 1 else 0 end) + 
     (case when phone like '%1%' then 1 else 0 end) + 
     (case when phone like '%2%' then 1 else 0 end) + 
     (case when phone like '%3%' then 1 else 0 end) + 
     (case when phone like '%4%' then 1 else 0 end) + 
     (case when phone like '%5%' then 1 else 0 end) + 
     (case when phone like '%6%' then 1 else 0 end) + 
     (case when phone like '%7%' then 1 else 0 end) + 
     (case when phone like '%8%' then 1 else 0 end) + 
     (case when phone like '%9%' then 1 else 0 end) + 
     ) as ints 
from table; 

あなたのコードは、いくつかの問題があります。

  • sum()は集約関数であり、必要ありません。
  • if()が文字列を返していますが、値を一緒に追加しています。
  • replace()ではなく、regexp_replace()を使用する理由がわかりません。
+0

ゴードン、速い応答のためにありがとう。方程式の和は必要ありません。私は入力を選んだ直後に実現しました。しかし、あなたのソリューションはずっと良い方法になり、より効率的です!ありがとう。 – invoketheshell

+0

私はすぐに合計の問題に気付きました。愚かな私。 'if'部分は文字列を返します。そのため、私は整数としてキャストします。限り、置換するapposedとしてregexp_replaceを使用して、私は多くの正規表現を使用して、習慣にデフォルトを設定していた。ソリューションに感謝します。それは確かに私のものよりも効率的です、私はそれを見ていたらいいと思います。乾杯。 – invoketheshell

関連する問題