SAS. Library Administrative. Management Console

Всем добрый день!

Сегодня представляю Вам видео-урок на тему администрирования и раздачи прав на библиотеку.

Из урока Вы узнаете:

  • Как запретить пользователю видеть библиотеку в SAS Enterprise Guide
  • Как регистрировать библиотеку в SAS Managment Console
  • Как зарегистрировать таблицы в библиотеке
  • Как раздавать права на библиотеку
  • Как раздать права на таблицу
  • Как сделать так, что бы пользователь имел полные права на библиотеку и мог делать в ней все что хочет.

P.S.
При подготовке урока были использованы материалы из материала.
P.P.S.
Для более комфортного просмотра ролика рекомендую разворачивать на полный экран, а также выставлять максимальное качество HD.
Если есть вопросы по материалы, можете оставлять их в комментариях к данному уроку.
С уважением,
Николай.

SAS 9.4. DOSUBL Function.

Всем добрый день.

Среди сильных сторон версии SAS 9.4 в интернете указывается функция DOSUBL.

Давайте разберем что же в ней такого особенного.

На сайте support.sas.com дается следующее описание данной функции:

Функция позволяет импортировать макро переменные из вызываемой среды и экспортировать макро переменные обратно в вызываемую среду.

Для большей наглядности давайте все же рассмотрим на примерах, а еще лучше в сравнении с функцией CALL EXECUTE.

Для начала создадим макрос, который будет создавать макро переменную xyz (с помощью call symput) и присваивать ей значение передаваемое нашему макросу:










Далее приведу код программы с использованием функции CALL ECECUTE:
































  1. Сверху видно окончание кода макроса. 
  2. Далее с помощью %let создаем макро переменную xyz и присваиваем ей значение q.
  3. После чего идет data step шаг в котором с помощью функции call execute вызывается созданный нами макрос %doit с параметром aa.
  4. После переменной xyz_value присваивается значение макро переменной xyz с помощью функции symget.
  5. В конце выводим значение переменной xyz_value.
Как мы видим из лога значение переменной вывелось равным q.
Это произошло потому что код, который выводился с помощью функции call execute выполнился после выполнения основного шага data step.
В принципе это видно также из лога, но давайте это проверим:



















Действительно значение переменной изменилось на то, которое мы хотели, а именно на aa

Теперь давайте приведем тот же самый пример, только с использованием функции dosubl:

Здесь я не буду расписывать столь подробно, как предыдущий шаг.
Однако видно, что макро doit выполнился раньше основного шага data step, что привело к изменению макро переменной xyz.
Что мы и наблюдаем в логе, где переменной xyz_value выведено bb значение.
 Данный пример иллюстрирует полезность рассматриваемой нами функции DOSUBL.
P.S.
Когда искал информацию по функции dosubl наткнулся на следующую статью 
В принципе из нее и был взят пример. Однако что меня поразило, что эта функция появилась еще в версии 9.3. Тогда стоит вопрос, почему же ее начали расхваливать только с версии 9.4.
И я решил проверить, запустив данный пример на версии SAS 9.3:
И оказалось, что работает она совсем не так, как описано в статье, а точнее вообще не работает. 
Так что будьте внимательны.
Надеюсь данная статья была полезна для Вас.
С  уважением, 
Николай.


SAS 9.4. The Future is coming. Threads.

Всем добрый день!

Сегодня хотелось бы заглянуть в будущее и посмотреть что нас ждет через год или два.

А ждет нас конечно же еще один болезненный переход на новую версию SAS, а именно на 9.4 (ну конечно же если вы уже с 9.2 перешли на 9.3)

Честно говоря очень много изменений случилось в новой версии SAS, чтобы об всем рассказать и книги не хватит. Я бы даже сказал произошла некая небольшая революция. Можно было бы даже назвать версию сразу 10, но в SAS Institute видимо посчитали, что еще рано.

Ну так о новшествах: В SAS 9.4 появился новый язык DS2. Чем-то он может напоминать объектно-ориентированный, но не дотягивает до него. Однако обычные возможности Data Step сильно расширились. И видимо многим придется заново переучиваться или сильно доучиваться, чтобы начать писать свои программы на языке DS2. Я думаю что до этого пройдет еще не менее 2-3 лет. Как показывает практика от запада мы отстаем на 2 года, а там еще не начали во всю использовать этот язык.

И все же сегодня затронем тему параллельных вычислений. Как же все мы мечтали распараллелить наш data step последовательный код (по крайней мере я очень давно мечтал это сделать 🙂
И вот это свершилось теперь мы может распараллеливать наши вычисления.

Примеры:

Для начала создадим тестовую таблицу с 10 000 000 записей.

Затем создаем THREAD:

Теперь будет делать подсчет всех чисел от 1 до 10 000 000 в один поток:

Мы видим, что real_time практически идентичен cpu time и составляет почти 28 секунд.

Теперь выполним ту же задачу только в 8 потоков:

Из лога можно видеть, что реальное время работы программы уменьшилось до 7 секунд. А также работа cpu выросла до 50 секунд.

Теперь давайте решим эту задачу с помощью нашего обычного data step кода:

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

Ниже привожу результаты выполнения наших экспериментов:

Таблица T1 (формировалась в один поток):

Таблица Т8 (формировалась в 8 потоков):

И табличка которая получилась через data step код:

В общем и целом результат везде одинаков: 50 000 005 000 000 (сумма всех чисел от 1 до 10 миллионов).

P.S.
При написании статьи были использованы следующие материалы:

Надеюсь данная статья была полезна.
С уважением, 
Николай.

SAS compress files. SAS copy files.

Всем привет!

Сегодня рассмотрим тему копирования файлов.

Копировать будем файл объемом 2,3 Гб и имеющего 13 697 371 строк.

 
1. Копирование будет осуществляться в другую папку на диске.

Видно, что на копирование нам потребовалось полторы минуты, а если точнее 1 минута и 28 секунд.

2.  Теперь давайте при копировании будет сжимать данные и посмотрим на время выполнения:

Мы видимо, что время выполнение программы практически не изменилось и даже уменьшилось на 8 секунд. Прошу обратить внимание, что процессорное время выросло за счет компрессии данных почти в два раза.

Теперь посмотрим на разницу в занимаемом пространстве на диске этих двух таблиц:

Мы видим, что разница в занимаемом пространстве существенная, а именно в 3 раза.

Так что могу советовать, чтобы SAS таблицы занимали меньше места на драгоценном дисковом пространстве — обязательно сжимайте их с помощью процедуры compress.

3  На по следок продемонстрирую еще один метод копирования, а именно с помощь системной функции copy, которую мы можем вызывать через SAS с помощью x — команды:

Если посмотреть на время выполнения команды (вычесть из нижнего времени начальное), то мы увидим, что код выполнялся 1 минуту 28 секунд.
Из этого можно сделать вывод, что копировать файлы через простой copypaste занимает столько же времени, как и через data set шаг.

Надеюсь данная информация была Вам полезна.

С уважением,
Николай.

SAS delete rows from dataset. Three ways.

Всем привет!

Сегодня рассмотрим простенький пример удаления записей из таблицы SAS.

Хотелось бы отметить, что все изложенный способы завязаны на то, что таблицу SAS можно просто перезаписать, наложив некоторое условие, т.е. выглядеть код будет примерно так:

data A;
set A;
if ….;
run;

Вот и все. А ниже привожу примеры:

Будем рассматривать набор с 1 800 734 строк и размером 305,8 Mб

1.  Идет по таблице обычным Data step шагом и вычищаем не нужные нам записи
в помощью delete 






2. Делаем обратную логику к нашему условию и вычищаем ненужные данный с помощью where

Хочу обратить внимание, что в данном примере мы прочитали лишь 735909 записей, а не все миллион восемьсот . Более подробно смотрите предыдущий урок: Optimization. Where and IF.

3. Также используем обратную логику (в данном примере not in) и условие if.. then output


В принципе как мы видим, на миллионах записей время работы всех способов примерно одинаково.

И напоследок хотел бы привести пример, как делать не надо:

Сразу приведу пример, а затем опишу что именно в нем не так:

То кто внимательно посмотрит на данный пример заметит, что в нем перешли от формата дата времени к формату дата. В SAS, как вы знаете эти форматы различаются. Так вот для этого пришлось применить функцию datepart на поле date_trade, что привело к увеличению времени работы кода.

Надеюсь данный пост был Вам полезен.

С уважением,
Николай.

SAS connect to Oracle. Part 5. PL/SQL

Всем добрый день!

Сегодня речь пойдет о выполнении PLSQL кода через SAS.

В SAS начиная с версии SAS 9.2 можно запускать plsql код используя execute().

Ниже привожу два примера, в одном из которых используются bind variable, в другом нет.

Также обратите внимание на большую разницу в с коросте выполнения скриптов:

without bind variable:

Как видно из лога цикл в PLSQL выполнялся 18 секунд

Теперь запустим тот же код с использованием bind переменной:

bind variable:

Здесь, как мы видим скорость выполнения цикла уменьшилась до 1 секунды.

Так что через SAS Access to Oracle можно выполнять любой PLSQL код в том числе и создавать процедуры.

Если данный пост был полезен Вам можете оставьте свой отзыв.

С уважением,
Николай.

SAS Optimization Code. Where and IF in Data Step code.

Сегодня хотел бы затронуть темы оптимизации SAS кода. На эту тему можно много чего сказать, но сегодня расскажу о том, что можно внедрить у себя уже сейчас, сразу после прочтения данной статьи.

Речь сегодня пойдет о разнице в использовании условий отбора Where и IF в Вашей коде. 
Не будем ходить в округ да около, а сразу начнем с примера:
WHERE:
IF:
Как говориться посмотри и найди разницу.
А разница состоит в отличии считанных строк. 
Таким образом best practices нам говорит использовать Where условие, хотя я честно говоря в примере особого выигрыша по времени не заметил. 
А теперь приведу картинку, раскрывающую теоретическую часть данного эксперимента:
Из приведенной картинки видно, что условие where проверяется еще до записи в PDV вектор, что экономит время работы программы. 
P.S. Если Вас заинтересовала статья по оптимизации кода и хотели бы ознакомиться еще с возможностью оптимизации, то просьба написать об этом в комментариях к данной статье.