記事の対象者と解消できるお悩み
【対象者】
初中級データアナリスト
【興味関心】
- テキストデータの分析
- 顧客データや商品データの加工
- SQLスキルアップ
- BigQueryの関数活用
- 業務効率化
- レポート作成の自動化
【解消できるお悩み】
- 顧客名や商品名など、テキストデータを分析したいけど、SQLの使い方がわからない…
- 顧客データから住所や氏名の一部を抽出したい
- 複数のデータを組み合わせて、新しいデータを作りたい
- BigQueryで文字列データを効率的に扱う方法を知りたい
- SQLでレポート作成を自動化したい
記事作成者
【人物】株式会社志庵 代表取締役 佐藤 光 起業6年目
【経歴】株式会社光通信➜光通信同期と起業➜データアナリスト転職➜SaaSで2度目起業
【会社実績】
SaaS 資金調達無しARR2億円
SaaS GMV200億円
【内容】自社AaaSであるStruccle、webスクレイピング、BigQueryに関する記事を作成
各種用語
- ARR(Annual Recurring Revenue)
- サブスクリプションサービスの年間売上※当社はSaaS売上
- Struccle(ストラクル)
- 株式会社志庵が独自開発しているAaaS
- AaaS(アース)
- Data Analytics as a Serviceの意
- SaaS(サース)
- Software as a Serviceの意
- GoogleCloudPlatform
- Googleが提供するクラウドプラットフォーム。この中に様々なサービスが存在する。
- GCP(ジーシーピー)
- GoogleCloudPlatformの略
- BigQuery(ビッグクエリ)
- 上記GCPの中に含まれるデータ分析基盤サービス
- SQL(エスキューエル)
- データベースを操作するプログラミング言語
- クエリ
- SQLで記述した命令文
- クエリ例)
- SQL構文のクエリ⬇
SELECT item_name, price FROM sales_table where price >= 1000;
- 上記クエリ(命令文)の意味としては「売上テーブル(sales_table)から価格(price)が1000円以上の商品名(item_name)と価格(price)を抽出する」
- SQL構文のクエリ⬇
- ペタバイト
- データの単位 ペタバイト=1000テラバイト=約100兆行のデータ
概要
データ分析では、顧客名、商品名、住所など、文字列データを扱うことは非常に一般的です。Google CloudのBigQueryは、文字列データを操作するための豊富な文字列関数を備えています。これらの関数を使いこなすことで、文字列の結合、分割、検索、置換、大文字・小文字変換など、様々な操作を効率的に行うことができます。
この記事では、BigQueryで利用できる基本的な文字列関数を、分かりやすい例とともに紹介します。BigQueryの無料公開データセットを使って、実際に手を動かしながら文字列関数をマスターしましょう!
目次
- BigQueryの文字列関数とは?
- BigQueryの基本文字列関数一覧
- ASCII
- BYTE_LENGTH
- CHAR_LENGTH
- CHARACTER_LENGTH
- CHR
- CODE_POINTS_TO_BYTES
- CODE_POINTS_TO_STRING
- COLLATE
- CONCAT
- CONTAINS_SUBSTR
- EDIT_DISTANCE
- ENDS_WITH
- FORMAT
- FROM_BASE32
- FROM_BASE64
- FROM_HEX
- INITCAP
- INSTR
- LEFT
- LENGTH
- LOWER
- LPAD
- LTRIM
- NORMALIZE
- NORMALIZE_AND_CASEFOLD
- OCTET_LENGTH
- REGEXP_CONTAINS
- REGEXP_EXTRACT
- REGEXP_EXTRACT_ALL
- REGEXP_INSTR
- REGEXP_REPLACE
- REGEXP_SUBSTR
- REPEAT
- REPLACE
- REVERSE
- RIGHT
- RPAD
- RTRIM
- SAFE_CONVERT_BYTES_TO_STRING
- SOUNDEX
- SPLIT
- STARTS_WITH
- STRPOS
- SUBSTR
- SUBSTRING
- TO_BASE32
- TO_BASE64
- TO_CODE_POINTS
- TO_HEX
- TRANSLATE
- TRIM
- UNICODE
- UPPER
- BigQuery公開データで実践!文字列関数を使った分析例
- FAQ:BigQueryに関するよくある質問
- まとめ:BigQueryの文字列関数をマスターして、テキストデータを自在に操ろう!
1. BigQueryの文字列関数とは?
BigQueryの文字列関数は、文字列データを操作するための関数です。文字列の結合、分割、検索、置換、大文字・小文字変換など、様々な操作を行うことができます。これらの関数を使いこなすことで、テキストデータの分析や加工を効率的に行うことができます。
2. BigQueryの基本文字列関数一覧
BigQueryで利用できる基本的な文字列関数を、例とともに紹介します。
2.1 ASCII
STRING または BYTES 値の最初の文字またはバイトの ASCII コードを取得します。
構文:
ASCII(value)
例: 文字列 ‘Hello’ の最初の文字 ‘H’ の ASCII コードを取得する
SELECT ASCII('Hello') AS ascii_code;
2.2 BYTE_LENGTH
STRING または BYTES 値のバイト数を取得します。
構文:
BYTE_LENGTH(value)
例: 文字列 ‘Hello’ のバイト数を取得する
SELECT BYTE_LENGTH('Hello') AS byte_length;
2.3 CHAR_LENGTH
STRING 値の文字数を取得します。
構文:
CHAR_LENGTH(value)
例: 文字列 ‘Hello’ の文字数を取得する
SELECT CHAR_LENGTH('Hello') AS char_length;
2.4 CHARACTER_LENGTH
CHAR_LENGTH のシノニムです。
構文:
CHARACTER_LENGTH(value)
例: 文字列 ‘Hello’ の文字数を取得する
SELECT CHARACTER_LENGTH('Hello') AS char_length;
2.5 CHR
Unicode コードポイントを文字に変換します。
構文:
CHR(code_point)
例: Unicode コードポイント 65 を文字 ‘A’ に変換する
SELECT CHR(65) AS character;
2.6 CODE_POINTS_TO_BYTES
拡張 ASCII コードポイントの配列を BYTES 値に変換します。
構文:
CODE_POINTS_TO_BYTES(array_of_ints)
例: コードポイントの配列 [72, 101, 108, 108, 111] を BYTES 値 ‘Hello’ に変換する
SELECT CODE_POINTS_TO_BYTES([72, 101, 108, 108, 111]) AS bytes_value;
2.7 CODE_POINTS_TO_STRING
拡張 ASCII コードポイントの配列を STRING 値に変換します。
構文:
CODE_POINTS_TO_STRING(array_of_ints)
例: コードポイントの配列 [72, 101, 108, 108, 111] を STRING 値 ‘Hello’ に変換する
SELECT CODE_POINTS_TO_STRING([72, 101, 108, 108, 111]) AS string_value;
2.8 COLLATE
STRING 値と照合仕様を組み合わせて、照合仕様がサポートされている STRING 値にします。
構文:
COLLATE(value, collation_specification)
例: 文字列 ‘Hello’ を照合仕様 ‘und:ci’ で照合する
SELECT COLLATE('Hello', 'und:ci') AS collated_string;
2.9 CONCAT
1 つ以上の STRING 値または BYTES 値を連結して、1 つの結果にします。
構文:
CONCAT(value1[, ...])
例: 文字列 ‘Hello’ と ‘World’ を連結する
SELECT CONCAT('Hello', ' ', 'World') AS greeting;
2.10 CONTAINS_SUBSTR
正規化された大文字と小文字を区別しない検索を実行して、値が式に部分文字列として存在するかどうかを確認します。部分文字列が存在する場合は TRUE を返し、そうでない場合は FALSE を返します。
構文:
CONTAINS_SUBSTR(expression, substring)
例: 文字列 ‘Hello World’ に部分文字列 ‘world’ が含まれているかどうかを確認する
SELECT CONTAINS_SUBSTR('Hello World', 'world') AS contains_substring;
2.11 EDIT_DISTANCE
2 つの STRING 値または BYTES 値間のレーベンシュタイン距離を計算します。レーベンシュタイン距離は、ある文字列を別の文字列に変換するために必要な最小の編集操作(挿入、削除、置換)の数です。
構文:
EDIT_DISTANCE(value1, value2[, max_distance])
例: 文字列 ‘kitten’ と ‘sitting’ のレーベンシュタイン距離を計算する
SELECT EDIT_DISTANCE('kitten', 'sitting') AS edit_distance;
2.12 ENDS_WITH
STRING または BYTES 値が別の値のサフィックスであるかどうかを確認します。サフィックスの場合は TRUE を返し、そうでない場合は FALSE を返します。
構文:
ENDS_WITH(value, suffix)
例: 文字列 ‘Hello World’ がサフィックス ‘World’ で終わるかどうかを確認する
SELECT ENDS_WITH('Hello World', 'World') AS ends_with_suffix;
2.13 FORMAT
データをフォーマットし、結果を STRING 値として生成します。printf スタイルのフォーマット文字列を使用します。
構文:
FORMAT(format_string, value1[, ...])
例: 数値 123.456 を小数点以下 2 桁にフォーマットする
SELECT FORMAT('%.2f', 123.456) AS formatted_number;
2.14 FROM_BASE32
base32 エンコードされた STRING 値を BYTES 値に変換します。
構文:
FROM_BASE32(string_expression)
例: base32 エンコードされた文字列 ‘ORUGS4ZANFZSAYJAORSXG5BA’ を BYTES 値に変換する
SELECT FROM_BASE32('ORUGS4ZANFZSAYJAORSXG5BA') AS bytes_value;
2.15 FROM_BASE64
base64 エンコードされた STRING 値を BYTES 値に変換します。
構文:
FROM_BASE64(string_expression)
例: base64 エンコードされた文字列 ‘SGVsbG8gV29ybGQ=’ を BYTES 値に変換する
SELECT FROM_BASE64('SGVsbG8gV29ybGQ=') AS bytes_value;
2.16 FROM_HEX
16 進数エンコードされた STRING 値を BYTES 値に変換します。
構文:
FROM_HEX(string_expression)
例: 16 進数エンコードされた文字列 ‘48656c6c6f20576f726c64’ を BYTES 値に変換する
SELECT FROM_HEX('48656c6c6f20576f726c64') AS bytes_value;
2.17 INITCAP
STRING を適切な大文字と小文字に変換します。つまり、各単語の最初の文字は大文字で、他のすべての文字は小文字になります。
構文:
INITCAP(value[, delimiters])
例: 文字列 ‘hello world’ を適切な大文字と小文字に変換する
SELECT INITCAP('hello world') AS proper_case_string;
2.18 INSTR
別の値内にあるサブ値の位置を見つけます。オプションで、指定されたオフセットまたは出現箇所から検索を開始できます。
構文:
INSTR(source_string, substring[, position[, occurrence]])
例: 文字列 ‘Hello World’ 内の ‘World’ の位置を見つける
SELECT INSTR('Hello World', 'World') AS position;
2.19 LEFT
STRING または BYTES 値から、指定された左端の部分を取得します。
構文:
LEFT(value, length)
例: 文字列 ‘Hello World’ の左端から 5 文字を取得する
SELECT LEFT('Hello World', 5) AS left_substring;
2.20 LENGTH
STRING または BYTES 値の長さを取得します。
構文:
LENGTH(value)
例: 文字列 ‘Hello’ の長さを取得する
SELECT LENGTH('Hello') AS string_length;
2.21 LOWER
STRING 値の英字を小文字に変換します。BYTES 値の ASCII 文字を小文字に変換します。
構文:
LOWER(value)
例: 文字列 ‘Hello World’ を小文字に変換する
SELECT LOWER('Hello World') AS lowercase_string;
2.22 LPAD
STRING または BYTES 値にパターンを付加します。
構文:
LPAD(original_value, return_length[, pattern])
例: 文字列 ‘Hello’ に ‘*’ を付加して、長さを 10 にする
SELECT LPAD('Hello', 10, '*') AS padded_string;
2.23 LTRIM
TRIM 関数と同じですが、先頭の文字のみを削除します。
構文:
LTRIM(value[, characters])
例: 文字列 ‘ Hello World’ から先頭の空白を削除する
SELECT LTRIM(' Hello World') AS trimmed_string;
2.24 NORMALIZE
STRING 値の文字を大文字と小文字を区別して正規化します。
構文:
NORMALIZE(value[, normalization_mode])
例: 文字列 ‘Héllö’ を NFC 形式で正規化する
SELECT NORMALIZE('Héllö', NFC) AS normalized_string;
2.25 NORMALIZE_AND_CASEFOLD
STRING 値の文字を大文字と小文字を区別せずに正規化します。
構文:
NORMALIZE_AND_CASEFOLD(value[, normalization_mode])
例: 文字列 ‘Héllö’ を NFC 形式で正規化する
SELECT NORMALIZE_AND_CASEFOLD('Héllö', NFC) AS normalized_string;
2.26 OCTET_LENGTH
BYTE_LENGTH のエイリアスです。
構文:
OCTET_LENGTH(value)
例: 文字列 ‘Hello’ のバイト数を取得する
SELECT OCTET_LENGTH('Hello') AS byte_length;
2.27 REGEXP_CONTAINS
値が正規表現と部分的に一致するかどうかを確認します。部分一致する場合は TRUE を返し、そうでない場合は FALSE を返します。
構文:
REGEXP_CONTAINS(value, regexp)
例: 文字列 ‘Hello World’ に正規表現 ‘W.*d’ が含まれているかどうかを確認する
SELECT REGEXP_CONTAINS('Hello World', r'W.*d') AS regexp_contains;
2.28 REGEXP_EXTRACT
正規表現に一致する部分文字列を生成します。
構文:
REGEXP_EXTRACT(value, regexp)
例: 文字列 ‘Hello World’ から正規表現 ‘W.*d’ に一致する部分文字列を抽出する
SELECT REGEXP_EXTRACT('Hello World', r'W.*d') AS extracted_substring;
2.29 REGEXP_EXTRACT_ALL
正規表現に一致するすべての部分文字列の配列を生成します。
構文:
REGEXP_EXTRACT_ALL(value, regexp)
例: 文字列 ‘Hello World’ から正規表現 ‘[A-Za-z]+’ に一致するすべての部分文字列を抽出する
SELECT REGEXP_EXTRACT_ALL('Hello World', r'[A-Za-z]+') AS extracted_substrings;
2.30 REGEXP_INSTR
値内の正規表現一致の位置を見つけます。オプションで、指定されたオフセットまたは出現箇所から検索を開始できます。
構文:
REGEXP_INSTR(source_string, regexp[, position[, occurrence]])
例: 文字列 ‘Hello World’ 内の正規表現 ‘W.*d’ の位置を見つける
SELECT REGEXP_INSTR('Hello World', r'W.*d') AS position;
2.31 REGEXP_REPLACE
正規表現に一致するすべての部分文字列が指定された値に置き換えられた STRING 値を生成します。
構文:
REGEXP_REPLACE(value, regexp, replacement)
例: 文字列 ‘Hello World’ 内の正規表現 ‘W.*d’ を ‘Everyone’ に置き換える
SELECT REGEXP_REPLACE('Hello World', r'W.*d', 'Everyone') AS replaced_string;
2.32 REGEXP_SUBSTR
REGEXP_EXTRACT のシノニムです。
構文:
REGEXP_SUBSTR(value, regexp)
例: 文字列 ‘Hello World’ から正規表現 ‘W.*d’ に一致する部分文字列を抽出する
SELECT REGEXP_SUBSTR('Hello World', r'W.*d') AS extracted_substring;
2.33 REPEAT
元の値を繰り返した STRING または BYTES 値を生成します。
構文:
REPEAT(original_value, repetitions)
例: 文字列 ‘Hello’ を 3 回繰り返す
SELECT REPEAT('Hello', 3) AS repeated_string;
2.34 REPLACE
STRING または BYTES 値内のすべてのパターンの出現箇所を、別のパターンに置き換えます。
構文:
REPLACE(original_value, from_value, to_value)
例: 文字列 ‘Hello World’ 内の ‘World’ を ‘Everyone’ に置き換える
SELECT REPLACE('Hello World', 'World', 'Everyone') AS replaced_string;
2.35 REVERSE
STRING または BYTES 値を反転します。
構文:
REVERSE(value)
例: 文字列 ‘Hello’ を反転する
SELECT REVERSE('Hello') AS reversed_string;
2.36 RIGHT
STRING または BYTES 値から、指定された右端の部分を取得します。
構文:
RIGHT(value, length)
例: 文字列 ‘Hello World’ の右端から 5 文字を取得する
SELECT RIGHT('Hello World', 5) AS right_substring;
2.37 RPAD
STRING または BYTES 値にパターンを付加します。
構文:
RPAD(original_value, return_length[, pattern])
例: 文字列 ‘Hello’ に ‘*’ を付加して、長さを 10 にする
SELECT RPAD('Hello', 10, '*') AS padded_string;
2.38 RTRIM
TRIM 関数と同じですが、末尾の文字のみを削除します。
構文:
RTRIM(value[, characters])
例: 文字列 ‘Hello World ‘ から末尾の空白を削除する
SELECT RTRIM('Hello World ') AS trimmed_string;
2.39 SAFE_CONVERT_BYTES_TO_STRING
BYTES 値を STRING 値に変換し、無効な UTF-8 文字を Unicode 置換文字 U+FFFD に置き換えます。
構文:
SAFE_CONVERT_BYTES_TO_STRING(value)
例: 無効な UTF-8 文字を含む BYTES 値を STRING 値に変換する
SELECT SAFE_CONVERT_BYTES_TO_STRING(b'\x80Hello') AS string_value;
2.40 SOUNDEX
STRING 値の単語の Soundex コードを取得します。Soundex は、英語の単語の発音をエンコードするアルゴリズムです。
構文:
SOUNDEX(value)
例: 文字列 ‘Robert’ と ‘Rupert’ の Soundex コードを取得する
SELECT SOUNDEX('Robert') AS soundex_robert, SOUNDEX('Rupert') AS soundex_rupert;
2.41 SPLIT
STRING または BYTES 値を、区切り文字を使用して分割します。
構文:
SPLIT(value[, delimiter])
例: 文字列 ‘apple,banana,orange’ を ‘,’ で分割する
SELECT SPLIT('apple,banana,orange', ',') AS fruits;
2.42 STARTS_WITH
STRING または BYTES 値が別の値のプレフィックスであるかどうかを確認します。プレフィックスの場合は TRUE を返し、そうでない場合は FALSE を返します。
構文:
STARTS_WITH(value, prefix)
例: 文字列 ‘Hello World’ がプレフィックス ‘Hello’ で始まるかどうかを確認する
SELECT STARTS_WITH('Hello World', 'Hello') AS starts_with_prefix;
2.43 STRPOS
別の値内にあるサブ値の最初の出現箇所の位置を見つけます。
構文:
STRPOS(haystack, needle)
例: 文字列 ‘Hello World’ 内の ‘World’ の位置を見つける
SELECT STRPOS('World Hello World', 'World') AS position;
2.44 SUBSTR
STRING または BYTES 値の一部を取得します。
構文:
SUBSTR(value, position[, length])
例: 文字列 ‘Hello World’ の 7 番目から 5 文字を取得する
SELECT SUBSTR('Hello World', 7, 5) AS substring;
2.45 SUBSTRING
SUBSTR のエイリアスです。
構文:
SUBSTRING(value, position[, length])
例: 文字列 ‘Hello World’ の 7 番目から 5 文字を取得する
SELECT SUBSTRING('Hello World', 7, 5) AS substring;
2.46 TO_BASE32
BYTES 値を base32 エンコードされた STRING 値に変換します。
構文:
TO_BASE32(bytes_expression)
例: BYTES 値 b’Hello World’ を base32 エンコードされた文字列に変換する
SELECT TO_BASE32(b'Hello World') AS base32_string;
2.47 TO_BASE64
BYTES 値を base64 エンコードされた STRING 値に変換します。
構文:
TO_BASE64(bytes_expression)
例: BYTES 値 b’Hello World’ を base64 エンコードされた文字列に変換する
SELECT TO_BASE64(b'Hello World') AS base64_string;
2.48 TO_CODE_POINTS
STRING または BYTES 値を、拡張 ASCII コードポイントの配列に変換します。
構文:
TO_CODE_POINTS(value)
例: 文字列 ‘Hello’ をコードポイントの配列に変換する
SELECT TO_CODE_POINTS('Hello') AS code_points;
2.49 TO_HEX
BYTES 値を 16 進数の STRING 値に変換します。
構文:
TO_HEX(bytes_expression)
例: BYTES 値 b’Hello World’ を 16 進数の文字列に変換する
SELECT TO_HEX(b'Hello World') AS hex_string;
2.50 TRANSLATE
値内で、各ソース文字を対応するターゲット文字に置き換えます。
構文:
TRANSLATE(expression, source_characters, target_characters)
例: 文字列 ‘Hello World’ 内の ‘aeiou’ を ‘AEIOU’ に置き換える
SELECT TRANSLATE('Hello World', 'aeiou', 'AEIOU') AS translated_string;
2.51 TRIM
STRING または BYTES 値から、指定された先頭と末尾の Unicode コードポイントまたはバイトを削除します。
構文:
TRIM([BOTH | LEADING | TRAILING] [characters] FROM value)
例: 文字列 ‘ Hello World ‘ から先頭と末尾の空白を削除する
SELECT TRIM(' Hello World ') AS trimmed_string;
2.52 UNICODE
値の最初の文字の Unicode コードポイントを取得します。
構文:
UNICODE(value)
例: 文字列 ‘Hello’ の最初の文字 ‘H’ の Unicode コードポイントを取得する
SELECT UNICODE('Hello') AS unicode_code_point;
2.53 UPPER
STRING 値の英字を大文字に変換します。BYTES 値の ASCII 文字を大文字に変換します。
構文:
UPPER(value)
例: 文字列 ‘Hello World’ を大文字に変換する
SELECT UPPER('Hello World') AS uppercase_string;
3. BigQuery公開データで実践!文字列関数を使った分析例
ここでは、BigQueryの公開データセット「NYC Taxi Trips」を使って、文字列関数を使った簡単なSQL分析例を紹介します。このデータセットには、ニューヨーク市のタクシー乗車に関する情報が格納されています。
例:store_and_fwd_flagを小文字に変換して表示する
SELECT
LOWER(store_and_fwd_flag) AS store_and_fwd_flag_uppercase
FROM
bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2015;
このクエリでは、`LOWER`関数を使って、`store_and_fwd_flag`カラム(文字列型)を小文字に変換しています。
4. FAQ:BigQueryに関するよくある質問
Q1. BigQueryの無料枠を超えて利用すると、どのくらい費用がかかりますか?
A1. 無料枠を超えた場合、従量課金制で料金が発生します。料金は、処理したデータ量やストレージ容量などによって異なります。詳しくは、BigQueryの料金ページをご確認ください。
Q2. BigQueryで使えるSQLは、他のデータベースと同じですか?
A2. BigQueryは標準SQLをサポートしており、他のデータベースで学んだSQLの知識を活かすことができます。ただし、BigQuery独自の関数や構文も存在するため、BigQueryのドキュメントで詳細を確認することをおすすめします。
Q3. SQLの学習には、どのような教材がありますか?
A3. SQLの学習には、オンライン学習サイト、書籍、動画教材など、様々な教材があります。初心者向けの教材から、上級者向けの教材まで、レベルに合わせて選ぶことができます。Googleが提供するBigQueryのチュートリアルもSQLの学習に役立ちます。
5. まとめ:BigQueryの文字列関数をマスターして、テキストデータを自在に操ろう!
BigQueryの文字列関数は、テキストデータを扱うデータ分析に非常に役立ちます。この記事で紹介した関数以外にも、様々な文字列関数が用意されています。BigQueryの公式リファレンスなどを参考に、文字列関数をマスターし、テキストデータを自在に操れるようになりましょう!
BigQuery導入サポート、転職検討中の方はお問い合わせフォームからご相談くださいませ。
誠心誠意精一杯対応いたします。
【参考URL】
GoogleCloudPlatform:https://console.cloud.google.com/welcome/new
BigQuery:https://cloud.google.com/bigquery?hl=ja
BigQueryリリース情報:https://cloud.google.com/bigquery/docs/release-notes
BigQuery料金:https://cloud.google.com/bigquery/pricing
BigQuery料金無料枠:https://cloud.google.com/bigquery/pricing?hl=ja#free-tier
Google Cloud活用事例:https://cloud.google.com/customers/index.html?hl=ja#
Looker Studio:https://cloud.google.com/looker-studio?hl=ja
Looker Studioサンプル:https://cloud.google.com/bigquery/docs/visualize-looker-studio?hl=ja