안녕하세요. 강사님 코드를 참조하며 공부를 하다보니, 어느새 새벽시간대가 되었네요 다름이 아니라, 방금 전 쯤에 질문 드린 xmltodict는 import 에러가 발생했는데, (비주얼스튜디오 환경에서 pip install 및 wsl2환경에서 pip install 했음에도 불구하고) 섹션7: CustomOperator 개발 실습 부근에서 pandas를 사용하는데, 비주얼 스튜디오 코드 가상환경(venv)에서 pandas 가 설치되어있지 않아서 제가 pip install pandas로 설치를 하고 진행을 했는데, airflow 상에서 import error 가 나지 않는 점 이 궁금해서 질문을 드리게 되었습니다. 추가) xml 데이터가 자꾸 안되어서 다른 데이터를 사용해보자는 마음으로 일단 json 양식까지 지원되는 open api를 물색해봤는데, 잘 동작하네요. --- 서울시 전기차 충전소 정보(서울시 설치) 서울시 전기차 급속충전기 정보 현황(서울시 설치) 서울시 자동차 전용도로 위치 정보(좌표계: GS80) 데이터 사이언티스트 쪽에서 데이터 엔지니어로 직무를 바꾸게 되었는데, 아무래도 정보가 정말 없다보니, 뭐부터 시작을 해야할지 막막했었습니다. 아직도 신입으로 취업하기 위해서는 구체적으로 어떤 것을 완성해야할지 모르지만, 인프런에서 좋은 강의를 알게 되어서 강사님께 항상 감사하게 생각하고 있습니다.
안녕하세요. 서울시 공공데이터 포털에 있는 실시간 데이터를 바탕으로, 진행해보고 싶어서 강사님께서 짜신 코드와 조금 다르게 구성을 했는데, 패키지 에러 문제가 나타났습니다. 에러 사항은 import xmltodict error문제 입니다. (1) 데이터 수집 https://data.seoul.go.kr/dataList/OA-21285/A/1/datasetView.do 샘플 데이터 양식: http://openapi.seoul.go.kr:8088/{API_KEY}/xml/citydata/{startnum}/{endnum}/POI{num} ' POI{num}의 경우, 해당 num은 숫자가 아닌 str형태입니다. (001 ~ 113) (저는 여기서, 전기차 충전소와 충전기 데이터 분석을 통해, 급속 충전기 최적 입지 데이터 분석을 해보고 싶어 크롤링과 MYSQL에 데이터를 수집은 해놓았습니다. ) (강사님께 airflow를 배우며, airflow를 통해 배치 기반으로 데이터 수집을 자동화하고 싶습니다.) [충전소 데이터] [충전기 데이터] --- (2) 에러 발생! (3) 코드 개요 from airflow import DAG from airflow.operators.bash import BashOperator from airflow.decorators import task from airflow.providers.http.operators.http import SimpleHttpOperator # import common.poi_func as poi_array# poi nums import pendulum with DAG( dag_id="dags_simple_http_operators", start_date=pendulum.datetime(2023, 8, 1, tz="Asia/Seoul"), catchup=False, schedule="0 18-20 * * *" #매일 오후 6시~8시 1시간 간격으로 실행 ) as dag: """ 서울시 실시간 전기차 충전소/충전기 데이터 정보 """ # http_conn_id = 'openapi.seoul.go.kr' #array = poi_array() #for poi_number in array: tb_electric_station_info = SimpleHttpOperator( task_id="tb_electric_station_info", http_conn_id='openapi.seoul.go.kr', endpoint= '{{var.value.apikey_openapi_seoul_go_kr}}/xml/citydata/1/1/광화문·덕수궁', method='GET', headers={"Content-Type": "application/xml"} ) @task(task_id='python_1') def python_1(**kwargs): ti = kwargs['ti'] rslt = ti.xcom_pull(task_ids='tb_electric_station_info') from pprint import pprint import xmltodict response_dict = xmltodict.parse(rslt) pprint(response_dict) tb_electric_station_info >> python_1() 강사님께서는 json.load()를 사용했지만, 해당 실시간 데이터는 xml 형식으로만 받아올 수 있어서, 출력을 하기 위해 xmltodict 를 import 해와서, 잘 받아오는지 테스트를 해보고자 하였습니다. 하나의 페이지에 무수히 많은 태그들이 있기 때문에, 페이지는 1페이지로만 설정을 했습니다. 해당 에러를 해결하기 위해서, pip install xmltodict를 진행하였습니다. 그럼에도, 해결이 되지 않아서, git이 연동되어있는 쪽에, pip install xmltodict로 패키지를 설치해주었습니다. 혹시 몰라서, docker compose down을 시킨 뒤, 다시 docker_compose.yaml 파일이 있는 곳에서 docker compose up을 실행하여 airflow 환경에 접속을 했는데, ModuleNotFoundError: No module named 'xmltodict' [2023-08-15, 23:47:23 KST] {taskinstance.py:1350} INFO - Marking task as FAILED. dag_id=dags_simple_http_operators, task_id=python_1, execution_date=20230815T144715, start_date=20230815T144723, end_date=20230815T144723 [2023-08-15, 23:47:23 KST] {standard_task_runner.py:109} ERROR - Failed to execute job 206 for task python_1 (No module named 'xmltodict'; 77) 여전히 해당 모듈이 없다는 에러가 뜨네요 .. 어떻게 해결해야할까요? --- [추가1] xcom에는 그래도 데이터가 잘 받아와지는 걸 확인할 수 있었습니다. 해당 데이터를 파싱하는 과정에서 에러가 난 것 같습니다. [추가2] 나름대로 방법을 찾아봤는데, https://stackoverflow.com/questions/67851351/cannot-install-additional-requirements-to-apache-airflow docker_compose.yaml파일을 수정해봤는데도... 종료가 되네요..
토픽을 구독하는 컨슈머를 콘솔에서 생성하면, 생성하는 컨슈머마다 항상 새로운 그룹이 만들어지게 되는거고 해당 토픽에 내부 파티션인 __consumer_offset가 생성된 컨슈머의 수만큼 만들어지는게 맞나요? 자바의 KafkaConsumer 를 사용할때 이미 존재하는 컨슈머 그룹에 참여한다면, 토픽에는 해당 컨슈머 그룹에 대한 정보인 __consumer_offset이 이미 존재하고 컨슈머에서 이 값을 읽어오니 earlist로 설정해도 0번 인덱스 레코드부터 읽는게 아닌 __consumer_offset에서 offset 값을 그대로 읽어와 사용하는게 맞나요?
안녕하세요. airflow에 관한 질 높은 수업을 정말 잘 듣고 있습니다. 다른 공부보다 airflow 공부하는 게 재밌어서, 시간 가는 줄 모르고 노션에 정리하며 실습을 해보고 있습니다. 다름이 아니라, airflow의 날짜 개념에 대해 제가 올바르게 이해했는지 확인을 하고 싶어서 문의를 드리게 되었습니다. 강의 내용은 Bash Operator with macros부분이며 dags_bash_with_macros_eg1과 dags_bash_with_macros_eg2에 대한 airflow log 값에 대한 부분입니다 START_DATE와 END_DATE에 대해서 올바르게 이해했는지 여쭈어보고 싶습니다.
선생님 안녕하세요. 테이블 설계 중 고민 중인 부분이 있어 강의 복습하다가 의견을 여쭙고자 질문드립니다. 제가 하려는 것은 json 구조로 내려오는 데이터를 key, value 모두 각각 저장하려고 합니다. 구조를 예를 들면, { "resReferenceList": [ { "resTriglyceride": "mg/dL", "resALT": "U/L", "resType": "단위", "resSight": "" }, { "resTriglyceride": "150미만", "resALT": "35이하", "resType": "정상(A)", "resSight": "" } ], "resResultList": [ { "resQuestionInfo": "", "resInfantsCheckupList": [ ], "resQuestionInfoList": [ { "resSmokingList": [ { "resPeriod": "", "resType": "일반담배(궐련)" }, { "resPeriod": "", "resType": "궐련형 전자담배", "resPeriod1": "" } ], "resApplicableYN1": "0", "resSmokingStatus": "0", "resDiseaseHistoryList": [ { "resApplicableYN": "0", "resType": "0", "resDisease": "뇌졸중(중풍)" }, { "resApplicableYN": "0", "resType": "0", "resDisease": "심장병(심근경색/협심증)" } ], "resApplicableYN": "0", "resAlcoholAmtList": [ { "resUnit": "병", "resNumber": "0.5", "resType": "평균", "resType1": "소주" } ] } ], "resOriGinalData": "", "resInfantsDentalList": [ ] }, { "resQuestionInfo": "", "resInfantsCheckupList": [ ], "resOriGinalData": "", "resInfantsDentalList": [ ] } ], "resCheckupTarget": "홍길동" } (json 구조가 잘 보이게 하고 싶은데 붙여넣기 하면 계속 이렇게 되네요ㅠ죄송합니다.) 이렇게 Object 형태에 List 형태도 포함되어 있습니다. 그런데 좀 더 까다로운게 위의 Object 가 [] List 에 담겨 여러개 나오는 경우도 있습니다. (이거까지 생각하면 복잡해서 일단 위 구조만 고려했습니다.) 이러한 형태가 계속해서 테이블에 쌓이게 하려고 합니다. 우선 트리 구조라고 생각했기 때문에 재귀 관계 테이블을 떠올려서 그렇게 작업을 하려고 했는데요. -Id (pk, auto increment) -부모테이블Id (fk, 위 데이터의 부모격인 메인 테이블이 있습니다. (1:M 관계)) -상위Id(id 와 fk 관계, 재귀) -리스트 번호(Obejct 가 리스트로 같은 상위 id 에 포함될 수 있는데, 그러면 각 Object 묶음이 구분이 되어야 하므로 구분하기 위한 번호) -key_name -value 이렇게 생각을 했는데 조회시 상당히 불편해서 다른 방법이 있을지 고민되어 질문드리게 되었습니다. 단순히 데이터를 쌓고 통계를 위한 조회 정도로 사용할 예정입니다. 위와 같은 데이터 구조의 key, value 를 모두 저장해야 할 때 재귀 관계를 사용하는게 최선인지 아니면 다른 고민해볼 포인트도 있는지 의견 여쭙고 싶습니다. 감사합니다.
안녕하세요 강사님, 오늘부터 새로 강의를 듣게 되었는데 완강 목표로 열심히 듣겠습니다 ㅎㅎ 강의 초반 환경설정에서 ga_export.sql이 large text여서 Dbeaver에서 스크립트 실행할 때 j ava heap space 부족 에러 가 발생하더라고요. 이 때 터미널로 쉽게 불러올 수 있는 방법을 찾았고, 다른 수강생분들에게도 도움이 될 것 같아 공유드립니다. 아래 스샷처럼 터미널에서 sudo -iu postgres psql 입력 후 \i [ga_export.sql이 위치한 경로] 를 입력하면 쉽게 ga 데이터를 불러올 수 있습니다.
채널별 고유/주문 사용자 건수와 매출 금액 및 비율 SQL로 구하기 2 를 학습하면서 /************************************ 채널별 고유 사용자 건수와 매출금액 및 비율, 주문 사용자 건수와 주문 매출 금액 및 비율 채널별로 고유 사용자 건수와 매출 금액을 구하고 고유 사용자 건수 대비 매출 금액 비율을 추출. 또한 고유 사용자 중에서 주문을 수행한 사용자 건수를 추출 후 주문 사용자 건수 대비 매출 금액 비율을 추출 *************************************/ with temp_01 as ( select a.sess_id, a.user_id, a.channel_grouping , b.order_id, b.order_time, c.product_id, c.prod_revenue from ga_sess a left join orders b on a.sess_id = b.sess_id left join order_items c on b.order_id = c.order_id where a.visit_stime >= (:current_date - interval '30 days') and a.visit_stime < :current_date ) select channel_grouping , sum(prod_revenue) as ch_amt -- 채널별 매출 --, count(distinct sess_id) as ch_sess_cnt -- 채널별 고유 세션 수 , count(distinct user_id) as ch_user_cnt -- 채널별 고유 사용자 수 --, count(distinct case when order_id is not null then sess_id end) as ch_ord_sess_cnt -- 채널별 주문 고유 세션수 , count(distinct case when order_id is not null then user_id end) as ch_ord_user_cnt -- 채널별 주문 고유 사용자수 --, sum(prod_revenue)/count(distinct sess_id) as ch_amt_per_sess -- 접속 세션별 주문 매출 금액 , sum(prod_revenue)/count(distinct user_id) as ch_amt_per_user -- 접속 고유 사용자별 주문 매출 금액 -- 주문 세션별 매출 금액 --, sum(prod_revenue)/count(distinct case when order_id is not null then sess_id end) as ch_ord_amt_per_sess -- 주문 고유 사용자별 매출 금액 , sum(prod_revenue)/count(distinct case when order_id is not null then user_id end) as ch_ord_amt_per_user from temp_01 group by channel_grouping order by ch_user_cnt desc; 위 쿼리의 쿼리 뜻이 잘 이해가 안되어 질문 드립니다. , sum(prod_revenue)/count(distinct user_id) as ch_amt_per_user -- 접속 고유 사용자별 주문 매출 금액 , sum(prod_revenue)/count(distinct case when order_id is not null then user_id end) as ch_ord_amt_per_user 이 두 항목은 각각 접속 고유 사용자별 주문 매출 금액, 주문 고유 사용자별 매출 금액이라 명칭 되어 있는데, 어떤 의미를 가지고 있는 것인지 잘 이해가 되지 않아 질문 드립니다. 접속 고유 사용자별 주문 매출 금액 : 사용자 대비 30일이내 매출 금액 주문 고유 사용자별 매출 금액 : 주문 대비 30일 이내 매출 금액 이렇게 이해를 하면 될런지요?
사용자별 월별 세션 접속 횟수의 구간별 분포 집계 SQL로 구하기 - 02 위 과정을 학습하고 있습니다 select month ,case when monthly_user_cnt = 1 then '0_only_first_session' when monthly_user_cnt between 2 and 3 then '2_between_3' when monthly_user_cnt between 4 and 8 then '4_between_8' when monthly_user_cnt between 9 and 14 then '9_between_14' when monthly_user_cnt between 15 and 25 then '15_between_25' when monthly_user_cnt >= 26 then 'over_26' end as gubun , count(*) as user_cnt from temp_01 group by month, case when monthly_user_cnt = 1 then '0_only_first_session' when monthly_user_cnt between 2 and 3 then '2_between_3' when monthly_user_cnt between 4 and 8 then '4_between_8' when monthly_user_cnt between 9 and 14 then '9_between_14' when monthly_user_cnt between 15 and 25 then '15_between_25' when monthly_user_cnt >= 26 then 'over_26' end order by 1, 2; 위 쿼리에서 group by 항목이 이해가 잘 안되서 질문 드립니다. 위와 같이 그룹을 지으면 일자 + monthly_user_cnt 의 조합으로 그룹들이 만들어짐 select에서 select month ,case when monthly_user_cnt = 1 then '0_only_first_session' when monthly_user_cnt between 2 and 3 then '2_between_3' when monthly_user_cnt between 4 and 8 then '4_between_8' when monthly_user_cnt between 9 and 14 then '9_between_14' when monthly_user_cnt between 15 and 25 then '15_between_25' when monthly_user_cnt >= 26 then 'over_26' end as gubun 위 쿼리로 넘어온 데이터(아직 컬럼으로 만들어지지 않은채 각 그룹별로 정의되어 넘어온 데이터)에 컬럼명을 붙여줌 위와 같은 동작을 하는게 맞는지요? 제가 이해하는게 맞는지 알고 싶습니다.
nestjs + mongoose 조합이지만, https://velog.io/@modolee/mongodb-document-to-javascript-object 와 같이 find()가 리턴하는 인스턴스 내부가 `_doc` 처럼 되어 있었습니다. 저는 user.age 이렇게 사용하고 싶은데, user 밑에 age 라는 변수도 없고, 꼭 .toObject()를 해야 하나요? 아직 이 부분에 수수께끼가 풀리지 않았습니다. 설명해 주실 수 있나요?
안녕하세요 강사님. 처음 stream 생성 후 삭제시에 토픽삭제 까지하는 명령어를 쳤을때 명령어실행후 ~was dropped. 라고 성공적으로 메시지도 뜨고 show streams; 했을때 stream 목록까지 안보이는데 console로 list확인했을떄 topic이 남아있는데 어떤 문제가 있어서 이러는걸까요?
데이터 분석 sql fundamentals의 다운받은 자료는 한글이 깨지지 않던데, 지금 강의는 다운받고 압축을 풀어보면 주석에 있는 한글이 다 깨져 있습니다. 강의를 보면서 한글이 보일때마다 최대한 수정을 해보려 하는데... 강의에 안보이는 한글 주석들이 꽤 있습니다. 저만 그런건지 확인 부탁 드리고 싶습니다. 제 환경은 윈도우11, 반디집으로 압축을 풀었습니다.
예를 들어, 가용한 브로커개수가 3개고 특정 토픽의 복제 개수가 2로 운영하는 경우라고 가정하겠습니다. 이때 이 토픽을 포함하고 있던 두 대중, 한대가 죽으면 이 토픽은 그 브로커가 다시 살아날 때까지 복제개수가 한개가 되는건가요? 아니면 원래는 이 토픽을 갖고있지않던 다른 브로에 이 토픽이 추가되어 운영되나요 ? 복제개수가 2ㅇ,ㄴ