2017-01-26 3 views
1

Мне нужно сделать небольшую маскировку данных в нашей таблице bigquery. Мне нужна результирующая таблица, имеющая ту же структуру, но удаляемую из личной информации.Сохранение вложенной структуры в таблице результатов при записи по вложенным данным

я делаю что-то вдоль линий:

select 
customer, 
"1234 Road" as tttt.address 
... 
from table 

Я не могу углубляться в детали, но мне нужно перезаписать вещи, такие как имя клиента и номер телефона, в то время как структура остается прежней ,

ответ

0

Вы можете использовать что-то вроде этого:

#standardSQL 
select 
    * EXCEPT(tttt), 
    (SELECT AS STRUCT tttt.* REPLACE("1234 Road" AS address)) AS tttt 
from table; 

В качестве конкретного примера:

#standardSQL 
WITH T AS (
    SELECT 
    1 AS x, 
    'foo' AS y, 
    STRUCT('kksdf' AS address, 1234 AS street) AS tttt 
) 
select 
    * EXCEPT(tttt), 
    (SELECT AS STRUCT tttt.* REPLACE("1234 Road" AS address)) AS tttt 
from T; 

Вы можете прочитать больше об этом синтаксисе в Query Syntax topic.

0

Вы можете использовать ниже подход, чтобы иметь возможность запрашивать живую исходную таблицу с затемненными/фиктивными точками данных

#standardSQL 
CREATE TEMP FUNCTION dummy_string(value STRING) 
AS ((SELECT CONCAT(value, '_', CAST(CAST(100000* RAND() AS INT64) AS STRING)))); 
WITH yourTable AS (
    SELECT 'customer1' AS customer, 'address1' AS address, 'phone1' AS phone UNION ALL 
    SELECT 'customer2' AS customer, 'address2' AS address, 'phone2' AS phone UNION ALL 
    SELECT 'customer3' AS customer, 'address3' AS address, 'phone3' AS phone UNION ALL 
    SELECT 'customer4' AS customer, 'address4' AS address, 'phone4' AS phone UNION ALL 
    SELECT 'customer5' AS customer, 'address5' AS address, 'phone5' AS phone 
) 
SELECT * REPLACE(
    dummy_string('aaaa') AS address, 
    dummy_string('bbbb') AS phone 
) 
FROM yourTable 

Вы можете использовать любое запутывание логики вы хотите иметь его реализацию в dummy_string() SQL UDF

Еще больше - на основе этого запроса вы можете сделать представление, которое будет находиться в отдельном наборе данных (отличном от набора данных, где имеется исходная таблица), чтобы любой, кто получит доступ к этому представлению (но не к исходной таблице), сможет изучить таблицу, но со скрытой/думкой моя данные-точка вашего выбора

Следуйте ниже шагов, чтобы это произошло

1 - Создание представления в наборе данных, отличных от набора данных, где yourTable проживает. Это важно!

#standardSQL 
SELECT * REPLACE(
    CONCAT('aaaa', '_', cast(CAST(100000* RAND() as INT64) as string)) AS address, 
    CONCAT('bbbb', '_', cast(CAST(100000* RAND() as INT64) as string)) AS phone 
) 
FROM yourTable 

Как вы можете видеть здесь - я не использую SQL UDF, поскольку UDF не поддерживаются View (пока - я надеюсь)

2 - Перейти Разделить Dataset меню набора данных, где исходная таблица является и добавить только созданный вид Уполномоченного View

3 - Перейти Разделить Dataset меню набора данных, где создаются вид и добавить в качестве средства просмотра тех пользователей, которые вы хотите иметь возможность играть с запутанной исходной таблицей

Над Setup - пользователь может видеть и использовать вид - но они не будут иметь доступ к исходной таблице/данные

#standardSQL 
SELECT * 
FROM yourView 

Я думаю, что этот пример может помочь вам