Передача SQL в SAS

Чтобы избежать двойных преобразований, можно использовать конструкцию try / except, например:

try:
    our_value = int(our_value)
except ValueError:
    our_value = 0

. В этом случае мы пытаемся привести значение к целому числу. Это будет успешным, если у нас уже есть целое число или строка, которая может быть интерпретирована как целое число.

Другие строки попадут в наш except случай и, таким образом, будут установлены в 0.

5
задан MarmiK 24 July 2018 в 13:17
поделиться

5 ответов

Хотя этот вопрос чрезмерно широк, я могу предоставить чрезмерно широкий ответ.

Передача SQL в SAS позволяет Вам связываться непосредственно с базой данных. Это становится очень выгодным при использовании базы данных определенные функции. Примером были бы функции статистики Oracle. Вы не должны волноваться о том, как SAS обработает Ваше кодирование или переведет Ваш SQL.

Кроме того, это также было преимущество для нас, что Передача SQL требует очень небольшой обработки на стороне SAS. Если у Вас есть чрезвычайно занятое поле SAS, можно решить отправить логику обработки непосредственно в базу данных. Это возможно, не используя Передачу SQL, но у Вас есть более высокий уровень контроля при использовании его.

Это ни в коем случае не исчерпывающий список преимуществ, просто несколько льгот высокого уровня к использованию передачи SQL. Если у Вас есть более конкретный вариант использования, мы можем обсудить конкретные различия в кодировании методов.

6
ответ дан 18 December 2019 в 12:02
поделиться

PROC SQL попытается передать такую большую логику, как это может к базе данных, но существуют различные времена, что это не может. Используя функции SAS, которые не имеют эквивалентными в базе данных (или в механизме SAS/доступа для базы данных), предотвратит передачу целого запроса к базе данных. Когда запрос не полностью передается базе данных, затем данные вытягивают в SAS и обрабатывают там. Чем более сложен Ваш SQL, тем более вероятно он закончит тем, что был обработан в SAS. Вот случай, который имеет большее значение, чем Вы могли бы понять.

libname db <database> path=dbserver user=... password=...;
proc sql;
   create table db.new as
   select * from db.largedata where flag=1;
quit;

Это будет на самом деле (по крайней мере, через SAS 9.1.3), вытягивают все данные, которые соответствуют flag=1 вниз к SAS, и затем загрузите его назад в базу данных. Это это - миллионы строк это действительно, замедляется.

Вы нашли бы явную передачу через намного быстрее в этом случае.

proc sql;
   connect dbase (server=dbserver user=... password=...);
   execute (create table db.new as
   select * from db.largedata where flag=1) as dbase;
   disconnect dbase;
quit;

Я недавно сделал использование в качестве примера Oracle и таблица приблизительно с 250 000 строк. Первый путь занял 20 секунд и второй путь к 2 секундам.

5
ответ дан 18 December 2019 в 12:02
поделиться

Если Вы не используете передачу, то необходимо импортировать все записи (что Вам нужно для обработки) от базы данных до SAS. При помощи передачи Вы можете иметь некоторую обработку, сделанную на стороне базы данных, и принести только по получающимся записям в SAS. Различие (с точки зрения времени обработки и использования сети) может очень от крошечного до огромного, в зависимости от того, что Вы делаете.

2
ответ дан 18 December 2019 в 12:02
поделиться

Существуют преимущества для использования передачи, но это зависит от того, что Вы пытаетесь выполнить. Обычно я использую стандарт proc sql без передачи при выполнении запросов. Недавно, однако, я использовал его для генерации, некоторые сохранили procs.

proc sql;
    connect to mysql(user = 'xxxxx' pass = 'xxxxx' server = 'localhost');
        execute(set @id = &id.) by mysql;
        execute(select (@lit:=image_text) from quality.links_image_text where image_id = @id) by mysql;
        execute(set @lidx = locate('ninja',@lit)) by mysql;
        execute(set @lidx2 = locate(' ',@lit,@lidx)) by mysql;
        execute(set @lidxd = @lidx2 - @lidx) by mysql;
        execute(set @lf = substr(@lit,@lidx,@lidxd)) by mysql;

        create table asdf as
        select &id. as id, a as ws from connection to mysql
        (select @lf as a)
        ;
    disconnect from mysql;
quit;

Очевидно, это не что-то, что может быть сделано за пределами передачи (по крайней мере, не, что я знаю о). Так да... все это зависит от того, что это, Вы пытаетесь выполнить.

2
ответ дан 18 December 2019 в 12:02
поделиться

Проще говоря, операторы передачи SQL дают вам больше контроля над тем, что отправляется в базу данных.

0
ответ дан 18 December 2019 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: